Lindorm SQL では、行全体にわたる集計処理(合計、平均、極値、文字列の連結)を実行するための集計関数がサポートされています。
対応エンジンおよびバージョン
| エンジン | バージョン |
|---|---|
| LindormTable | すべてのバージョン |
| LindormTSDB | V3.4.7 以降 |
HEAD および GROUP_CONCAT を使用するには、LindormTable 2.7.9 以降および Lindorm SQL 2.8.8.0 以降が必要です。
関数一覧
| 関数 | 説明 | 必要バージョン |
|---|---|---|
| AVG | 指定した列のすべての値の平均値を返します | すべてのバージョン |
| COUNT | 指定した列の非空値の個数、または全行数を返します | すべてのバージョン |
| MAX | 指定した列の最大値を返します | すべてのバージョン |
| MIN | 指定した列の最小値を返します | すべてのバージョン |
| SUM | 指定した列の値の合計を返します | すべてのバージョン |
| HEAD | 指定した列または式の最初の非空値を返します(任意で並べ替え順序を指定可能) | LindormTable 2.7.9+、Lindorm SQL 2.8.8.0+ |
| GROUP_CONCAT | 各グループ内の列値を単一の文字列に連結します | LindormTable 2.7.9+、Lindorm SQL 2.8.8.0+ |
サンプルテーブル
このトピックの例では、以下の sensor テーブルを使用します:
-- sensor という名前のテーブルを作成します。
CREATE TABLE sensor(
device_id VARCHAR NOT NULL,
region VARCHAR NOT NULL,
time TIMESTAMP NOT NULL,
temperature DOUBLE,
humidity BIGINT,
PRIMARY KEY(device_id, region, time)
);
-- 複数行のデータを一度に書き込みます。
UPSERT INTO sensor(device_id ,region ,time,temperature) VALUES('F07A1260','north-cn','2021-04-22 15:33:20',10.6), ('F07A1261','south-cn','2021-04-22 15:33:00',18.1), ('F07A1261','south-cn','2021-04-22 15:33:10',19.7);AVG
指定した列のすべての値の平均値を返します。
構文
AVG(column_name)パラメーター
| パラメーター | 説明 |
|---|---|
column_name | 平均値を算出する列。数値型のデータ型である必要があります。 |
例
すべてのデバイスにおける温度の平均値を計算します:
SELECT AVG(temperature) AS temperature FROM sensor;出力結果:
+--------------------+
| temperature |
+--------------------+
| 16.133333333333333 |
+--------------------+COUNT
指定した列の非空値の個数を返します。また、* を指定して呼び出した場合は、全行数を返します。
構文
COUNT(* | column_name)パラメーター
| パラメーター | 説明 |
|---|---|
column_name | 非空値の個数をカウントする列。 |
* | NULL 値を含むすべての行をカウントします。 |
例
温度測定値の個数をカウントします:
SELECT COUNT(temperature) AS temperature FROM sensor;出力結果:
+-------------+
| temperature |
+-------------+
| 3 |
+-------------+device_id が F07A1260 の行数をカウントします:
SELECT COUNT(*) FROM sensor WHERE device_id = 'F07A1260';出力結果:
+--------+
| EXPR$0 |
+--------+
| 1 |
+--------+テーブル内の全行数をカウントします:
SELECT COUNT(*) FROM sensor;出力結果:
+--------+
| EXPR$0 |
+--------+
| 3 |
+--------+MAX
指定した列の最大値を返します。
構文
MAX(column_name)パラメーター
| パラメーター | 説明 |
|---|---|
column_name | 評価対象の列。 |
例
すべてのデバイスで記録された最高温度を取得します:
SELECT MAX(temperature) FROM sensor;出力結果:
+--------+
| EXPR$0 |
+--------+
| 19.7 |
+--------+MIN
指定した列の最小値を返します。
構文
MIN(column_name)パラメーター
| パラメーター | 説明 |
|---|---|
column_name | 評価対象の列。 |
例
すべてのデバイスで記録された最低温度を取得します:
SELECT MIN(temperature) FROM sensor;出力結果:
+--------+
| EXPR$0 |
+--------+
| 10.6 |
+--------+SUM
指定した列の値の合計を返します。
構文
SUM(column_name)パラメーター
| パラメーター | 説明 |
|---|---|
column_name | 合計を算出する列。数値型のデータ型である必要があります。 |
例
すべての温度測定値の合計を計算します:
SELECT SUM(temperature) FROM sensor;出力結果:
+--------+
| EXPR$0 |
+--------+
| 48.4 |
+--------+HEAD
expr1 で指定した列または式の最初の非空値を返します。expr2 で指定した列または式に基づいて行をソートしたうえで、最初の値を選択します。expr2 を省略した場合、最初のプライマリキー列でソートされます。
LindormTable 2.7.9 以降および Lindorm SQL 2.8.8.0 以降が必要です。現在のバージョンは、コンソールで確認してください:「LindormTable リリースノート」および「Lindorm SQL のバージョンの説明」。アップグレードについては、「LindormTable インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。
構文
HEAD (expr1 [ ORDER BY expr2 [ DESC ] ] )パラメーター
| パラメーター | 説明 |
|---|---|
expr1 | 最初の非空値を取得する列または式。対応するデータの型:INTEGER、BIGINT、SMALLINT、TINYINT、FLOAT、DOUBLE、DECIMAL、BOOLEAN、VARCHAR、CHAR、TIMESTAMP、JSON、GEOMETRY。 |
expr2 | ソート対象の列または式。省略した場合、最初のプライマリキー列でソートされます。他の集計関数を指定することはできません(例: HEAD(c1 ORDER BY COUNT(c2)) はサポートされていません)。 |
例
昇順および降順のソートを用いて、最小および最大の温度を取得します:
SELECT HEAD(temperature ORDER BY temperature), HEAD(temperature ORDER BY temperature DESC) FROM sensor;出力結果:
+--------+--------+
| EXPR$0 | EXPR$1 |
+--------+--------+
| 10.6 | 19.7 |
+--------+--------+最も短い device_id を持つデバイスの温度を取得します:
SELECT HEAD(temperature ORDER BY LENGTH(device_id)) FROM sensor;出力結果:
+--------+
| EXPR$0 |
+--------+
| 10.6 |
+--------+GROUP_CONCAT
GROUP BY 句で指定した列に基づいて行をグループ化し、各グループ内の値をソートしたうえで、単一の文字列に連結します。
LindormTable 2.7.9 以降および Lindorm SQL 2.8.8.0 以降が必要です。コンソールで現在のバージョンを確認してください:「LindormTable リリースノート」および「Lindorm SQL のバージョンの説明」。アップグレード方法については、「LindormTable インスタンスのマイナーエンジンバージョンをアップグレードする」をご参照ください。
構文
GROUP_CONCAT ( [ DISTINCT ] expr (, expr ... )*
[ ORDER BY col_name [ DESC ] (, col_name [ DESC ])* ]
[ SEPARATOR str_val ] )DISTINCT および ORDER BY は、同一の GROUP_CONCAT 呼び出し内で併用できません。
パラメーター
| パラメーター | 説明 |
|---|---|
expr | 連結対象の射影列。 |
col_name | ソート対象の列。 |
str_val | 連結される値の間の区切り文字。 |
例
以下の例では、t1 テーブルを使用します:
-- t1 という名前のサンプルテーブルを作成します。
CREATE TABLE t1 (p1 INT, p2 VARCHAR, c1 INT, c2 VARCHAR, c3 DOUBLE, PRIMARY KEY(p1, p2));
-- テーブルにデータを挿入します。
UPSERT INTO t1(p1, p2, c1, c2, c3) VALUES
(1, 'a', 10, 'java', 10.23),
(1, 'b', 10, 'c/c++', 5.76),
(1, 'c', 18, 'python', 8.21),
(2, 'a', 40, 'sql', 3.14),
(2, 'b', 100, 'c#', 4.96),
(2, 'c', 66, 'matlab', 7.01);例 1:c1 の値を p1 でグループ化して連結します:
SELECT p1, GROUP_CONCAT(c1) FROM t1 GROUP BY p1;出力結果:
+----+-----------+
| p1 | EXPR$1 |
+----+-----------+
| 1 | 10,10,18 |
| 2 | 40,100,66 |
+----+-----------+例 2:c1 の重複を除外した値を p1 でグループ化して連結します:
SELECT p1, GROUP_CONCAT(DISTINCT c1) FROM t1 GROUP BY p1;出力結果:
+----+-----------+
| p1 | EXPR$1 |
+----+-----------+
| 1 | 18,10 |
| 2 | 100,40,66 |
+----+-----------+例 3:c1 の値を p1 でグループ化し、c1 を昇順でソートして連結します:
SELECT p1, GROUP_CONCAT(c1 ORDER BY c1) FROM t1 GROUP BY p1;出力結果:
+----+-----------+
| p1 | EXPR$1 |
+----+-----------+
| 1 | 10,10,18 |
| 2 | 40,66,100 |
+----+-----------+例 4:c1 の値を p1 でグループ化し、c3 を降順でソートして連結します:
SELECT p1, GROUP_CONCAT(c1 ORDER BY c3 DESC) FROM t1 GROUP BY p1;出力結果:
+----+-----------+
| p1 | EXPR$1 |
+----+-----------+
| 1 | 10,18,10 |
| 2 | 66,100,40 |
+----+-----------+例 5:例 4 と同じですが、区切り文字としてパイプ (|) を使用します:
SELECT p1, GROUP_CONCAT(c1 ORDER BY c3 DESC SEPARATOR '|') FROM t1 GROUP BY p1;出力結果:
+----+-----------+
| p1 | EXPR$1 |
+----+-----------+
| 1 | 10|18|10 |
| 2 | 66|100|40 |
+----+-----------+