前言
书接上回大数据分析入门10分钟快速了解SQL。
本篇将会进一步介绍group by语法。
基本语法
SELECT column_name, aggregate_function(column_name)
FROM table_name
GROUP BY column_name
HAVING condition
假设我们有students
表,其中有id
,grade_number
,class_number
,name
4个字段
- 如果需要统计每个年级(grade)有多少人,那么SQL是
SELECT grade_number, count(id) as cnt
FROM students
GROUP BY grade_number
- 如果需要统计每个年级(grade)的每个班级(class)有多少人,那么SQL是
SELECT grade_number, class_number, count(id) as cnt
FROM students
GROUP BY grade_number,class_number -- GROUP BY 支持多列
- 如果你想知道哪些班级超过了50人,那就需要用到
HAVING
了
SELECT grade_number, class_number, count(id) as cnt
FROM students
GROUP BY grade_number,class_number
HAVING count(id) > 50 -- 对聚合结果进行过滤
进阶用法
刚刚只展示了1个count
函数,实际可用的聚合函数有很多。
以SparkSQL为例
- 常见的数学函数
函数名 | 作用 |
---|---|
max | 最大值 |
min | 最小值 |
count | 计数 |
sum | 求和 |
… | … |
“数学函数”比较简单,就不用举例子了
- 常见的集合函数
函数名 | 作用 |
---|---|
collect_list | 将所有结果聚合到一个list(一种不去重的数据类型) |
collect_set | 将所有结果聚合到一个set(一种去重的数据类型) |
… | … |
举个例子,想知道每个班级有哪些人
SELECT grade_number, class_number, collect_list(id) as cnt
FROM students
GROUP BY grade_number,class_number -- GROUP BY 支持多列
结果将会是
1年级,1班, [‘张三’,'李四']
...
1年级, 8班, ['秦朗']
...
- 抽样函数
聚合函数能搭配distinct
来使用,例如count(distinct name)
统计name
去重后的结果。
不过大数据场景一般少用count (distinct name)
, 会用approx_count_distinct(name)
来替代.
因为大数据的计算比较慢,抽样可以更快地得到一个近似值。
总结
聚合语法主要在于了解各种聚合函数,每个引擎都有自己的函数手册可以查阅,下面就是SparkSQL的函数手册。