group by与聚集函数

group by命令,通过字面意思可以明白,就是根据(by)一定的规则进行分组(group)。更具体点就是按照数据库中某一或某些字段(group by后接的关键字)进行分组。举例:

select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartment group by DepartmentID;

聚集函数:Postgresql的聚集函数包括count(计数)、sum(和)、avg(均值)、max(最大值)和min(最小值)函数,这些函数用于在一个行集合上的运算操作。

group by

它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

 select DepartmentID as '部门名称',COUNT(*) as '个数' from BasicDepartment group by DepartmentID;

上命令表示对数据库 BasicDepartment进行分组,DepartmentID相等的数据归为一组,只显示一条记录,并统计各个不同部门(DepartmentID)的人数。

注意
select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID;

将会出现错误。

选择列表中的列 ‘DepartmentName’ 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。为什么呢,根据前面的说明:DepartmentID相等的数据归为一组,只显示一条记录,那如果数据集中有这样三条数据。

  	DepartmentID                               DepartmentName 
        dept001                                            技术部 
        dept001                                            综合部 
        dept001                                            人力部 

那我只能显示一条记录,我显示哪个?没法判断了。到这里有三种选择:

1.把DepartmentName也加入到分组的条件里去(GROUP BY DepartmentID,DepartmentName),那这三条记录就是三个分组。
2.不显示DepartmentName字段。
3.用聚合函数把这三条记录整合成一条记录count(DepartmentName)。

聚集函数与HAVING过滤

HAVING子句可以让我们筛选分组后的各组数据。HAVING子句中可以使用聚合函数。
举例说明:
显示每个地区的总人口数和总面积,仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area) FROM statisticsTable GROUP BY region
HAVING SUM(area)>1000000;

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选分组后的各组数据。

where子句和HAVING子句

当同时含有where子句、group by 子句 、HAVING子句及聚集函数时,执行顺序如下:
1.执行where子句查找符合条件的数据;
2.使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用HAVING子句去掉不符合条件的组。
总的来说,HAVING子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。但HAVING子句限制的是组,而不是行。where子句中不能使用聚集函数,而HAVING子句中可以。

理解聚集和SQL的WHERE以及HAVING子句之间的关系对我们非常重要。WHERE和HAVING的基本区别如下:WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而HAVING在分组和聚集之后选取分组行。因此,WHERE子句不能包含聚集函数; 因为试图用聚集函数判断哪些行应输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数(严格说来,你可以写不使用聚集的HAVING子句, 但这样做很少有用。同样的条件用在WHERE阶段会更有效)。

补充:
在greenplum中,经常会用到以下命令来查看数据在各个节点的分布情况:

select gp_segment_id,count(1) from table_name group by 1;

在上命令中,count(1)表示按照表中的第一个字段进行统计,count(1)和count(*)类似,唯一区别是count(1)不统计null字段,而count(*)统计null字段。
group by 1表示select命令后的第一个字段,在此表示gp_segment_id。

参考:
1.https://blog.csdn.net/liu_shi_jun/article/details/51329472
2.http://www.postgres.cn/docs/9.6/tutorial-agg.html

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值