GROUP BY は複数の列をサポートし、SELECT 列の別名を使用して対応する KEY を示します。

例:

method:PostLogstoreLogs |select avg(latency),projectName,date_trunc('hour',__time__) as hour group by projectName,hour

エイリアス hour は、3 番目の SELECT 列 date_trunc('hour',__time__)を表します。 このような使用法は、非常に複雑な query には非常に役立ちます。

GROUP BY は GROUPING SETS, CUBE, 及び ROLLUP をサポートしています。

例:

method:PostLogstoreLogs |select avg(latency) group by cube(projectName,logstore)
method:PostLogstoreLogs |select avg(latency)   group by GROUPING SETS ( ( projectName,logstore), (projectName,method))
method:PostLogstoreLogs |select avg(latency) group by rollup(projectName,logstore)

実践例

時刻に従って GROUP BY を実行する

各ログには組込みの時間列 __time__ があります。 任意の列の統計機能が有効になっていると、統計は自動的に時間列に対して作成されます。

date_trunc 関数を使用して、時間列を時、分、日、月、および年に合わせます。 date_trunc は、整列単位と、UNIX の時刻または timestamp 型の列 __time__ などを受け入れます。

  • 1 時間または 1 分ごとに PV を数えて計算する
    * | SELECT count(1) as pv , date_trunc('hour',__time__) as hour group by hour order by hour limit 100
    * | SELECT count(1) as pv , date_trunc('minute',__time__) as minute group by minute order by minute limit 100
    limit 100 は、最大 100 行を取得することを示します。 LIMIT ステートメントを追加しなければ、デフォルトで最大 10 行のデータを取得します。
  • 柔軟な時間ディメンションに従って統計を作成します。 たとえば、5 分ごとに統計を作成します。 date_trunc は一定期間ごとにのみ統計を作成できるため、 数学的係数法に従って GROUP BY を 実行します。
    * | SELECT count(1) as pv, __time__ - __time__% 300 as minute5 group by minute5 limit 100
    %300 は、5 分ごとにモジュラスとアライメントを作成することを示します。

GROUP BY で非 agg 列を抽出する

標準 SQL では、GROUP BY 構文を使用すると、SELECT を実行する際に、SELECT GROUP BY 列の元の内容のみ選択できます。あるいは、任意の列で集約計算を実行する際に非 GROUP BY 列の内容を 取得することはできません。

たとえば、次の構文は無効です それは b が非 GROUP BY 列であり、a に従って GROUP BY を実行すると、b の複数行が使用可能になるためです。システムは、どの行の出力を選択すれば良いのかを認識できません。

*|select a, b , count(c) group by a

上記を達成するには、arbitrary 関数を使用して b を出力します。

*|select a, arbitrary(b), count(c) group by a