前言
书接上回大数据分析入门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,name4个字段
- 如果需要统计每个年级(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的函数手册。











