全部產品
Search
文件中心

Simple Log Service:GROUP BY子句

更新時間:May 24, 2025

GROUP BY子句通常與彙總函式一起使用,用來對查詢結果中的資料行進行分組。每個分組都基於一列或多列的值。通過這種方式,可以為每個不同的組合產生一個合計列,從而協助使用者更有效地分析資料。此外,GROUP BY子句還可以搭配ROLLUPCUBEGROUPING SETS子句,以擴充其分組功能,提供更多樣化的資料分析選項。

基本文法

GROUP BY

對分析結果進行分組。

SELECT 
 key1,
  ...
 aggregate_function
 GROUP BY 
 key,...

參數說明如下所示:

  • key1:是您希望根據其值來分組的列,支援按照日誌欄位名稱或彙總函式計算結果列進行分組。GROUP BY子句支援單列或多列。

  • aggregate_function:是應用在每個分組上的彙總函式,如countminmaxavgsum等。

GROUP BY ROLLUP

GROUP BY ROLLUP子句按照匯總分組,支援為每個分組返回一個小計,為所有分組返回一個總計。例如GROUP BY ROLLUP (a, b)的結果集為(a, b)(a, null)(null, null)

SELECT
key1,
 ...
aggregate_function 
GROUP BY ROLLUP (key1,...)

參數說明如下所示:

  • key1:是您希望根據其值來分組的列,支援按照日誌欄位名稱或彙總函式計算結果列進行分組。GROUP BY子句支援單列或多列。

  • aggregate_function:是應用在每個分組上的彙總函式,如countminmaxavgsum等。

GROUP BY CUBE

GROUP BY CUBE子句按照所有可能的列組合進行分組。例如GROUP BY CUBE (a, b)的結果集為(a, b)(null, b)(a, null)(null, null)

SELECT 
key1,
...
aggregate_function 
GROUP BY CUBE (key1,...)

參數說明如下所示:

  • key1:是您希望根據其值來分組的列,支援按照日誌欄位名稱或彙總函式計算結果列進行分組。GROUP BY子句支援單列或多列。

  • aggregate_function:是應用在每個分組上的彙總函式,如countminmaxavgsum等。

GROUP BY GROUPING SETS

GROUP BY GROUPING SETS子句按照列依次進行分組。例如GROUP BY GROUPING SETS (a, b)的結果集為(a, null)(null, b)

SELECT 
key1,
... 
aggregate_function
GROUP BY GROUPING SETS (key1,...)

參數說明如下所示:

  • key1:是您希望根據其值來分組的列,支援按照日誌欄位名稱或彙總函式計算結果列進行分組。GROUP BY子句支援單列或多列。

  • aggregate_function:是應用在每個分組上的彙總函式,如countminmaxavgsum等。

樣本

重要

在SQL語句中,如果使用了GROUP BY子句,則在SELECT語句中只能選擇以下兩類內容:

  • GROUP BY子句中指定的列;

  • 對任意列進行彙總計算的結果(如COUNT()SUM()等)。

直接選擇非GROUP BY列是不允許的,因為這些列的值在分組後可能不唯一,無法明確其含義。例如,以下語句是非法的:

* | SELECT status, request_time, COUNT(*) AS PV GROUP BY status

原因是request_time並未包含在GROUP BY子句中,且未對其進行彙總處理。

正確的寫法可以是:

* | SELECT status, arbitrary(request_time), COUNT(*) AS PV GROUP BY status

在這裡,arbitrary(request_time)是對request_time進行彙總處理的一種方式,表示從每個分組中任意選取一個request_time值。這樣既符合 SQL 的文法規則,又能滿足查詢需求。

  • 樣本1

    統計不同狀態代碼對應的請求次數。

    • 查詢和分析語句

      * | SELECT status, count(*) AS PV GROUP BY status
    • 查詢和分析結果group by

  • 樣本2

    按照每小時的時間粒紋計算網站訪問PV。

    • 查詢和分析語句

      __time__欄位為Log Service中的保留欄位,表示時間列。timedate_trunc('hour', __time__)的別名。關於date_trunc函數的更多資訊,請參見date_trunc函數

      * |
      SELECT
        count(*) AS PV,
        date_trunc('hour', __time__) AS time
      GROUP BY
        time
      ORDER BY
        time
      LIMIT
        1000                       
    • 查詢和分析結果group by

  • 樣本3

    按照每5分鐘的時間粒紋計算PV。

    • 查詢和分析語句

      因為date_trunc函數只能按照固定時間間隔統計。如果您需要按照自訂的時間進行統計分析,請按照數學模數方法進行分組。例如%300表示按照5分鐘的時間粒紋進行模數對齊。

      * |
      SELECT
        count(*) AS PV,
        __time__-__time__ % 300 AS time
      GROUP BY
        time
      LIMIT
        1000
    • 查詢和分析結果group by

  • 樣本4

    根據要求方法和請求狀態分組,先計算各個要求方法對應的訪問資料,再計算各個請求狀態對應的訪問數量。

    • 查詢和分析語句

      * |
      SELECT
        request_method,
        status,
        count(*) AS PV
      GROUP BY
        GROUPING SETS (request_method, status)
    • 查詢和分析結果GROUPING SETS

  • 樣本5

    根據要求方法和請求狀態分組,分組集包括(null, null)(request_method, null)(null, status)(request_method, status),計算以上各個分組的訪問數量。

    • 查詢和分析語句

      * |
      SELECT
        request_method,
        status,
        count(*) AS PV
      GROUP BY
       CUBE (request_method, status)
    • 查詢和分析結果CUBE

  • 樣本6

    根據要求方法和請求狀態分組,分組集包括(request_method, status)(request_method, null)(null, null),計算以上各個分組的訪問數量。

    • 查詢和分析語句

      * |
      SELECT
        request_method,
        status,
        count(*) AS PV
      GROUP BY
       ROLLUP (request_method, status)
    • 查詢和分析結果ROLLUP