group by 和 over(partition by)的区别

本文详细介绍了SQL中group by与over(partition by)的区别和应用,通过具体实例展示了如何使用这两种方法进行数据的分组统计。文章对比了它们在处理数据时的不同之处,特别是在计算部门总薪水的应用场景下,提供了深入的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

废话不多说,直接来干货!

1>建表并插入数据,因为over是开窗函数,mysql不支持开窗函数,其他如oracle,sql server,db2...等新版本都支持(这里借用他人的数据)

CREATE TABLE Employee
(
  ID number(10) not null primary key,
  EmpName varchar(20),
  EmpSalary varchar(10),
  EmpDepartment varchar(20)
);

insert all into Employee values(1,'张三','5000','开发部')
into Employee values(2,'李四','2000','销售部')
into Employee values(3,'王麻子','2500','销售部')
into Employee values(4,'张三表叔','8000','开发部')
into Employee values(5,'李四表叔','5000','开发部')
into Employee values(6,'王麻子表叔','5000','销售部')
select 1 from dual

2>计算每个部门的总薪水?

2.1>group by

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

2.2>over(partition by)

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

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

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。本人小白,如有错误,还望指出,谢谢!!!

### SQL GROUP BY PARTITION BY区别及用法 #### GROUP BY 子句概述 `GROUP BY` 是用于汇总数据并执行聚合操作的关键字。当使用 `GROUP BY` 时,查询会将具有相同值的一组列组合在一起,并允许应用诸如 COUNT()、SUM() 或 AVG() 这样的聚集函数来计算每组的结果[^1]。 例如,在员工工资表中统计各部门平均薪资: ```sql SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; ``` 此命令返回每个部门对应的平均薪水记录。 #### PARTITION BY 子句概述 相比之下,`PARTITION BY` 主要应用于窗口函数内,它不会减少原始表格中的行数而是创建逻辑分区以便于跨这些分区内进行运算处理而不影响其他部分的数据展示形式。 下面的例子展示了如何利用排名功能基于成绩对学生打分而无需改变原有数据集结构: ```sql SELECT student_id, score, RANK() OVER(PARTITION BY class ORDER BY score DESC) as rank_in_class FROM scores; ``` 这段代码为同一班级内的学生按照分数高低赋予名次,但保持了所有学生的独立条目显示方式不变。 #### 关键差异总结 - **作用范围**: 使用 `GROUP BY` 后得到的是经过压缩后的结果集合;而通过 `PARTITION BY` 划分子区间的原表依旧保留其全部细节。 - **适用场景**: 当需要获取关于特定字段的统计数据(如总数、均值等),应采用 `GROUP BY`; 若要维持现有视图的同时实现某些类型的分析,则更适合选用带有 `PARTITION BY` 参数配置过的窗口函数来进行操作[^2].
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值