Lindorm提供了一系列聚合函数,例如统计函数COUNT,求和函数SUM等,以满足您对数据分析的多样化需求。
引擎与版本
本文适用的引擎和版本如下:
宽表引擎。无版本要求。
时序引擎。版本为3.4.7及以上。
函数列表
Lindorm支持的聚合函数如下表所示。
函数 | 说明 |
返回指定列的平均值。 | |
返回指定条件的非空值的个数。 | |
返回指定列的最大值。 | |
返回指定列的最小值。 | |
返回指定列的总和。 | |
返回指定列(或表达式)的第一个非NULL值。 | |
将投影列(一列或者多列)按照分组列( |
本文提供的示例全部基于以下表结构和数据:
-- 创建示例表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 | 列名。 |
示例
统计所有设备的温度的值个数。
SELECT COUNT(temperature) AS temperature FROM sensor;
返回结果:
+-------------+ | temperature | +-------------+ | 3 | +-------------+
统计sensor表中device_id为F07A1260的行数。
SELECT COUNT(*) FROM sensor WHERE device_id = 'F07A1260';
返回结果:
+--------+ | EXPR$0 | +--------+ | 1 | +--------+
统计sensor表的行数。
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的第一个非NULL值,且支持根据expr2的值进行排序。
要求宽表引擎为2.7.9及以上版本,且Lindorm SQL为2.8.8.0及以上版本。您可以在控制台查看宽表引擎版本和Lindorm SQL版本,并升级小版本至2.7.9及以上版本。
语法
HEAD (expr1 [ ORDER BY expr2 [ DESC ] ] )
参数说明
参数 | 描述 |
expr1 | 待输出的表达式。 表达式的类型支持所有的整型(INTEGER、BIGINT、SMALLINT、TINYINT)、浮点型(FLOAT、DOUBLE、DECIMAL)、布尔型(BOOLEAN)、字符串(VARCHAR、CHAR)、TIMESTAMP、JSON、Geometry。 |
expr2 | 指定排序的方法。缺省时,按照第一主键列排序。 重要 expr2不支持与其他聚合函数嵌套使用,例如不支持 |
示例
查询
temperature
的最小值和最大值。SELECT HEAD(temperature ORDER BY temperature), HEAD(temperature ORDER BY temperature DESC) FROM sensor;
返回结果:
+--------+--------+ | EXPR$0 | EXPR$1 | +--------+--------+ | 10.6 | 19.7 | +--------+--------+
查询
LENGTH(device_id)
最小值对应的temperature
。SELECT HEAD(temperature ORDER BY LENGTH(device_id)) FROM sensor;
返回结果:
+--------+ | EXPR$0 | +--------+ | 10.6 | +--------+
GROUP_CONCAT
将投影列(一列或者多列)按照分组列(GROUP BY
后的列)进行分组。对于每一组,将投影列按照排序列(一列或者多列)进行排序之后,拼接成一个长字符串,返回该拼接的字符串。
要求宽表引擎为2.7.9及以上版本,且Lindorm SQL为2.8.8.0及以上版本。您可以在控制台查看宽表引擎版本和Lindorm SQL版本,并升级小版本至2.7.9及以上版本。
语法
GROUP_CONCAT ( [ DISTINCT ] expr (, expr ... )*
[ ORDER BY col_name [ DESC ] (, col_name [ DESC ])* ]
[ SEPARATOR str_val ] )
DISTINCT
与ORDER BY
关键字不能同时使用。
参数说明
参数 | 描述 |
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);
示例一:将
c1
根据p1
分组。SELECT p1, GROUP_CONCAT(c1) FROM t1 GROUP BY p1;
返回结果:
+----+-----------+ | p1 | EXPR$1 | +----+-----------+ | 1 | 10,10,18 | | 2 | 40,100,66 | +----+-----------+
示例二:将
c1
根据p1
分组,且移除重复值。SELECT p1, GROUP_CONCAT(DISTINCT c1) FROM t1 GROUP BY p1;
返回结果:
+----+-----------+ | p1 | EXPR$1 | +----+-----------+ | 1 | 18,10 | | 2 | 100,40,66 | +----+-----------+
示例三:将
c1
根据p1
分组,且按照自身升序。SELECT p1, GROUP_CONCAT(c1 ORDER BY c1) FROM t1 GROUP BY p1;
返回结果:
+----+-----------+ | p1 | EXPR$1 | +----+-----------+ | 1 | 10,10,18 | | 2 | 40,66,100 | +----+-----------+
示例四:将
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 | +----+-----------+
示例五:将
c1
根据p1
分组,且按照c3
降序,并将结果用竖线|
拼接成字符串。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 | +----+-----------+