SQL:group by 的用法及其与 over(partition by)的区别

1.group by的作用

根据一定的规则将一个数据集划分成若干个小区域,然后针对每个区域进行数据处理。即分组查询,一般是和聚合函数配合使用。

重点说明(重要):
如果用Select选择某个字段,那么这个字段要么在Group By子句中,作为分组的依据;要么就要在聚合函数中。

正确例子:

//正确例子
//这个例子是允许的,不会报错
//按部门分类,查找每个部门的编号、人数和最高的工资数
select d.dept_no, count(*) as emp_no, max(s.salary)
from dept_emp as d join salaries as s
on d.emp_no = s.emp_no
group by d.dept_no;

错误例子:

//错误例子
//按部门分类,查找每个部门的编号、最高工资的员工编号和最高的工资数
select d.dept_no, d.emp_no, max(s.salary) //d.emp_no既不是分组条件也不是聚合结果
from dept_emp as d join salaries as s
on d.emp_no = s.emp_no
group by d.dept_no;

group by的错误用法,上面代码报错的
原因是:d.emp_no既不是分组条件也不是聚合结果。

2.group by 与 over(partition by)的区别

以例子说明:

计算每个部门的总薪水

2.1group by

SELECT EmpDepartment,SUM(EmpSalary) sum_sala FROM Employee GROUP BY EmpDepartment

在这里插入图片描述

2.2over(partition by)

SELECT EmpSalary,EmpDepartment,SUM(EmpSalary) OVER(PARTITION BY EmpDepartment) sum_sala FROM Employee

在这里插入图片描述

小结:group bypartition by 都有分组统计的功能,但是partition by并不具有group by的汇总功能。partition by统计的每一条记录都存在,而group by将所有的记录汇总成一条记录(类似于distinct EmpDepartment 去重)。partition by可以和聚合函数结合使用,同时具有其他高级功能。

2.3补充:在partition by 后在加上order by

SELECT EmpSalary,EmpDepartment,SUM(EmpSalary) OVER(PARTITION BY EmpDepartment ORDER BY EmpSalary) sum_sala FROM Employee

在这里插入图片描述

小结:加上order by 后,类似于累加功能(sum_sala += EmpSalary),先观察销售部的结果,从第4条记录开始,其sum(EmpSalary)sum_sala=2000,第5条记录,sum(EmpSalary)=sum_sala+2500=4500,即第4条sum_sala与第5条EmpSalary的和,依次类推;开发部,由于2个5000是并列的,所以计算的时候是几个并列数据之和即5000+5000=10000。

参考文章:
1.https://www.jianshu.com/p/82f2c3e1c3f8
2.https://blog.csdn.net/WuLex/article/details/115037696

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
partition by和group by是在SQL中用于分组和聚合数据的关键字,它们之间有以下区别: 1. 功能不同: - group by是用于将数据按照指定的列进行分组,然后对每个组进行聚合操作,例如求和、计数等。 - partition by是用于在分析函数中指定分组的方式,它定义了每个分组的范围,然后在每个分组内进行计算。 2. 执行顺序不同: - 在SQL语句的执行顺序中,group by是在where之后、select之前执行的,它根据指定的列进行分组,然后对每个组进行聚合操作。 - partition by是在select之后执行的,它根据指定的列进行分组,并在每个分组内进行计算。 3. 使用场景不同: - group by适用于需要对整个数据集进行分组和聚合的情况,例如统计每个部门的销售总额。 - partition by适用于需要在每个分组内进行计算的情况,例如计算每个部门的销售额占比。 下面是一个示例,演示了partition by和group by的区别: 假设有一个表sales,包含以下字段:department(部门)、product(产品)、quantity(数量)、price(单价)。 1. 使用group by计算每个部门的销售总额: ```sql SELECT department, SUM(quantity * price) AS total_sales FROM sales GROUP BY department; ``` 2. 使用partition by计算每个部门的销售额占比: ```sql SELECT department, product, quantity * price / SUM(quantity * price) OVER (PARTITION BY department) AS sales_ratio FROM sales; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打孔猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值