group by 与 partition by

本文深入探讨了Oracle数据库中partition by关键字与group by的区别,并通过实例展示了分析函数如何实现对分组数据的复杂计算。重点讲解了partition by在分组查询中的作用以及性能考量。

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

partition   by关键字是oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition   by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它有一部分函数既是聚合函数也是分析函数,比如avg、max,也有一部分是特有的,比如first、rank,除了order   by子句外,分析函数在一个查询中优先级最低。至于partition   by和group   by谁的性能更好,要看具体情况而定,从你所举的例子而言,partition   by的作用仅用于分组,那么性能可能比不上group   by。

 

例子:

sum()   over   (PARTITION   BY   ...)   是一个分析函数。   他执行的效果跟普通的sum   ...group   by   ...不一样,它计算组中表达式的累积和,而不是简单的和。

表a,内容如下:
B C D
02 02 1
02 03 2
02 04 3
02 05 4
02 01 5
02 06 6
02 07 7
02 03 5
02 02 12
02 01 2
02 01 23

select   b,c,sum(d)   e   from   a   group   by   b,c
得到:
B C E
02 01 30
02 02 13
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7

而使用分析函数得到的结果是:
SELECT   b,   c,   d,   SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a
B C E
02 01 2
02 01 7
02 01 30
02 02 1
02 02 13
02 03 2
02 03 7
02 04 3
02 05 4
02 06 6
02 07 7
结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:
SELECT   b,   c,   d,SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a
B C D E
02 01 2 2                     d=2,sum(d)=2
02 01 5 7                     d=5,sum(d)=7
02 01 23 30                   d=23,sum(d)=30
02 02 1 1                     c值不同,重新累计
02 02 12 13
02 03 2 2
02 03 5 7
02 04 3 3
02 05 4 4
02 06 6 6
02 07 7 7

### 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].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值