partition by和group by的区别和对比

今天大概弄懂了partition bygroup by的区别联系。

1. group by是分组函数partition by是分析函数(然后像sum()等是聚合函数);

2. 在执行顺序上,

以下是常用sql关键字的优先级

from > where > group by > having > order by

partition by应用在以上关键字之后,实际上就是在执行完select之后,在所得结果集之上进行partition

3. partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类似excel中的操作),而group by只保留参与分组的字段和聚合函数的结果(类似excel中的pivot)。

partition by

group by

4. 如果partition结果上聚合,千万注意聚合函数是逐条累计运行结果!而在group by后的结果集上使用聚合函数,会作用在分组下的所有记录上

数据如下,

SQL1

select 
    a.cc,
    a.item,
    sum(a.num)
from table_temp a
group by a.cc,a.item

Result1

11条记录经group by后为10条,其中cc='cn' and item='8.1.1'对应的两条记录的num汇总成值3.

SQL2

select 
    a.cc,
    a.num, 
    min(a.num) over (partition by a.cc order by a.num asc) as amount
from table_temp a
group by a.cc,a.num;


select 
    a.cc,
    a.num, 
    min(a.num) over (partition by a.cc order by a.num desc) as amount
from table_temp a
group by a.cc,a.num;

Result2

  

两个sql的唯一区别在于a.num的排序上,但从结果红框中的数据对比可以看到amount值并不相同,且第二个结果集amount并不都是最小值1。

在这里就是要注意将聚合函数用在partition后的结果集上时,聚合函数是逐条累积计算值的!

其实partition by常同row_number() over一起使用,

select 
    a.*,
    row_number() over (partition by a.cc,a.item order by a.num desc) 
as seq
from table_temp a

清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉

  • 34
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
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; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值