前言:
最近在工作中发现有小伙伴对partition by 和 group by的概念、使用犯迷糊,只知道是做聚合用,却不知道其计算的过程和对应机制。闲言少叙,进入正题。😉😉
🌽🌽Partition by 和 Group by分别是什么🥜🥜
2.1 group by
😎😎😎group by 是一个高频使用的表达式,其主要应用过程就是将符合条件的数据集中到一个分组里面,然后进行聚合。
😎😎😎适用场景:分组求聚合值,例如最大,最小,求和等。
示例代码如下:😄😁😁
SELECT
column1,
column2,
AGGREGATE_FUNCTION (column3)
FROM
table1
GROUP BY
column1,
column2;
代码注解:
🐶🐶AGGREGATE_FUNCTION:聚合函数,常见的有Max,Sum,Min,Count
🐶🐶column1,column2:代表table中的列。
2.2 partition by
partition by 算子和窗口函数搭配使用,实现数据的窗口运算。
🐶🐶适用场景:分组组内排名,分组组内,分组聚合,以及分组组内范围数据计算。
示例代码:
SELECT
*,
window_function_name( COL3 ) OVER (
PARTITION by COL1,COL2
) FROM
table;
代码注解:
🐶🐱window_function_name:窗口函数,常见的有RANK,ROW_NUMBER,Max,Min,Sum等
🐭🐭COL[1-3]:代表table中的列。
3 🦄🦄🦄group by 和 partition by区别
简单介绍了Group by 和 partition by的使用方式和效果。下面则着重的介绍一些二者的区别,主要是应用上的区别,具体有两点:1、返回结果 2、返回列
3.1 返回结果区别
👇🏻👇🏻分别是聚合函数和窗口函数执行区别
👇🏻👇🏻:代表一条数据,也就是row
👉🏻👉🏻敲黑板!!👇🏻👇🏻面到必须会的:
聚合函数:将多条数合并成一条,且把蓝色块的位置赋值为求和。🐯🐯🐯
窗口函数:求出多条数据的累加值后,保留所有数据,并在所有数据后缀了累加值📢📢📢。
3.2 返回列区别
👉🏻👉🏻敲黑板!!👇🏻👇🏻面到必须会的:
Group by :使用group by时,select 中只能出现group by后面出现的列名,也就是说你用什么条件分组聚合,你就只能查什么。
partition by:使用partition by ,对Select 查询什么列名没有影响。
3.3 具体原理
通过查看两种SQL的AST tree,来看一下他们的解析结果以及对应的原始执行顺序。这里的原始执行顺序指的是不经过编译器优化的执行顺序。
👇👇窗口函数的AST tree:
SELECT *,sum(1) over (partition by depart_id) FROM employees;
👇👇聚合函数的AST tree:
SELECT depart_id,sum(1) FROM employees group by depart_id ;
从上文中明显看到的就是窗口函数的解析位置和聚合函数解析位置一致,但是聚合函数的group by 的解析位置相对于来说比较靠后。换句话就是聚合函数,需要先执行Group by之后,再执行聚合函数。