聚合函数(如sum()、avg()、max()等等)是针对定义的行集(组)执行聚集,每组只返回一个值。
窗口函数也是针对定义的行集(组)执行聚集,可为每组返回多个值。如既要显示聚集前的数据,又要显示聚集后的数据。
窗口查询有两个步骤:将记录分割成多个分区,然后在各个分区上调用窗口函数。
语法:主要是over( PARTITION BY (根据某条件分组,形成一个小组)….ORDER BY(再组内进行排序) …. )
over:
over (order by col1) --按照 col1 排序, 没分区范围就是整个表over (partition by col1) --按照 col1 分区 over (partition by col1 order by col2) -- 按照 col1 分区,按照 col2 排序--带有窗口范围over (partition by col1 order by col2 ROWS 窗口范围) -- 在窗口范围内,按照 col1 分区,按照 col2 排序
实例:
-- 按照age排序,每阶段的age数据进行统计求和
select id,age,name, count() over(order by age) from wt1;
结果:
-- 窗口范围是表下按照age进行分区
-- 在分区里面,再按照age进行排序
select id,age,name, count() over(partition by age order by age) from wt1;
-- 窗口范围是表下按照age进行分区
-- 在分区里面,再按照id进行降序排序
select id,age,name, count() over(partition by age order by age) from wt1;
序列函数
row_number:会对所有数值,输出不同的序号,序号唯一且连续,如:1、2、3、4、5。
rank:会对相同数值,输出相同的序号,而且下一个序号间断,如:1、1、3、3、5。
dense_rank:会对相同数值,输出相同的序号,但下一个序号不间断,如:1、1、2、2、3。
ROW_NUMBER()
row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。
表数据:
-- rn_id 按照性别分组,按照id排序
select id,sex,name, row_number() over(partition by sex order by id desc) from student;
--查询student表中按照sex分组,取每组的最小id的记录
select a.* from
(select sex,age,id, row_number() over(partition by sex order by id) as rn from student) a
where a.rn = 1;
over中partition by和distribute by区别:
1)partition by [key..] order by [key..]只能在窗口函数中使用,而distribute by [key...] sort by [key...]在窗口函数和select中都可以使用。
2)窗口函数中两者是没有区别的
3)where后面不能用partition by
Window 函数:
ROWS窗口函数中的行选择器 rows between [n|unbounded preceding]|[n|unbounded following]|[current row] and [n|unbounded preceding]|[n|unbounded following]|[current row]
参数解释:
n行数
unbounded不限行数
preceding在前N行
following在后N行
current row当前行
应用场景:
1)查询当月销售额和近三个月的销售额
2)查询当月销售额和今年年初到当月的销售额
表数据:
实例:
-- 查询当月销售额和近三个月的销售额
SELECT
y,
m,
sales,
sum(sales) OVER(PARTITION BY y ROWS between unbounded preceding and current row) AS s2
FROM sale_table;