提示
Hive SQL 教程 欢迎使用。提供建议、纠错、催更等加作者微信: gairuo123(备注:sql )和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
GROUP BY 语句是把数据按一定的维度(数据表中的字段或者计算后的分组依据)分组,结合一些聚合函数来计算出分组特征数据。
一个列中为分类数据(有限重复,离散的)时,为了了解这些类别的数据表现情况,将这个列的数据分组,分组后表格的索引(可以理解为首列,多列分组为前几列)就变成了这些分组列,且不重复(或者组合不重复)。一些非分组列就需要进行聚合,使用计算方法如求和、求平均等方法进行计算,当然同一个列可以同时有多个不同的聚合方法。如图:
因此,在 SQL 中,分组依据的列直接可以输出,非分组列需要聚合计算才能输出。
分组的语法如下:
SELECT AGG_FUNC(column_or_expression) AS aggregate_description
FROM mytable
WHERE constraint_expression
GROUP BY column1, column2;
说明:
在用 Group By 按一定的字段分组时,如果你不想写字段名,可以用 Select 中的序号来代码这些字段,如:
SELECT item_id, uesr_id
^^^^ ^^^^
1 2
FROM tab
GROUP BY 1;
在上面的查询中 GROUP BY 1 指的是 select 语句中的第一列,那就是 item_id。这个用法,还可以用在 ORDER BY 子句中。
注意:ORDER BY 和GROUP BY 中的数字始终以 1 开头,而不是以 0 开头。
本文例子中使用的数据是筛选指定字段中的数据内容。
select class as class, -- 班级
avg(2020 - b_year) as avg_age, -- 平均年龄
avg(math) as avg_math -- 数学平均成绩
from students
where gender == '男'
group by class
'''
class|avg_age|avg_math|
-----+-------+--------+
1| 51.0| 71.5|
2| 31.5| 71.0|
3| 31.5| 77.5|
'''
以上的逻辑为将男生按班级分组,给出每班的平均年龄和平均数学成绩。
select class as class,
gender as gender,
avg(2020 - b_year) as avg_age,
avg(math) as avg_math
from students
group by class, gender
'''
class|gender|avg_age|avg_math|
-----+------+-------+--------+
1|女 | 28.0| 66.5|
1|男 | 51.0| 71.5|
2|女 | 10.0| 88.0|
2|男 | 31.5| 71.0|
3|男 | 31.5| 77.5|
'''
以上同时按班级和性别进行分组。
select (case
when b_year >= 2000 then '00后'
when b_year >= 1990 then '90后'
else '其他'
end) as gap,
avg(math) as avg_math
from students
group by (case
when b_year >= 2000 then '00后'
when b_year >= 1990 then '90后'
else '其他'
end)
'''
gap|avg_math|
---+--------+
00后| 73.0|
90后| 55.0|
其他| 77.4|
'''
以上按年龄分组再进行聚合。
HAVING 可以在聚合后对聚合的结果进行条件筛选,因为聚合后的字段不是数据表里的真实字段。
select class as class, -- 班级
avg(2020 - b_year) as avg_age -- 平均年龄
from students
group by class
having avg_age > 30
order by avg_age
'''
class|avg_age|
-----+-------+
3| 31.5|
1| 39.5|
'''
以上,聚合后对返回的结果再将年龄大于 30 岁的筛选出来,再进行排序。
更新时间:2021-08-19 20:43:49 标签:sql groupby