开窗——聚合函数与分析函数

开窗——聚合函数与分析函数

应用场景
(1)排序
(2)动态分组group by
(3)top n
(4)累计计算
(5)层次查询

窗口函数

first_value(col):取分组内排序后,截止到当前行,第一个值
last_value(col): 取分组内排序后,截止到当前行,最后一个值
lead(col,n,default) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为null时候,取默认值,如不指定,则为null)
lag(col,n,default) :用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为null时候,取默认值,如不指定,则为null)

over从句

1、over前使用标准的聚合函数count、sum、min、max、avg,也可以使用其他分析函数row_number()、rank()、dense_rank()、cume_dist、percent_rank、ntile(n)
2、over后括号内使用partition by语句进行分组,可以是一列或多列
3、over后括号内使用order by语句进行排序,可以是一列或多列
4、综合使用partition by与order by语句先后组再排序,可以是一列或多列,数据为分组内排序后截止当前行之前计算内容

窗口规范

开窗——聚合函数

count、sum、min、max、avg、collect_set、collect_list


with tmp as
(
select 'd001' as order_id,123 as user_id,20 as amt,'2020-01-01 00:23:33' as pay_time
union all select 'd002' as order_id,123 as user_id,25 as amt,'2020-01-02 00:23:33' as pay_time
union all select 'd005' as order_id,123 as user_id,250 as amt,'2020-01-04 00:23:33' as pay_time
union all select 'd007' as order_id,123 as user_id,100 as amt,'2020-01-06 00:23:33' as pay_time
union all select 'd003' as order_id,125 as user_id,15 as amt,'2020-01-03 00:23:33' as pay_time
union all select 'd004' as order_id,125 as user_id,39 as amt,'2020-01-03 00:23:33' as pay_time
union all select 'd006' as order_id,125 as user_id,25 as amt,'2020-01-05 00:23:33' as pay_time
union all select 'd008' as order_id,125 as user_id,359 as amt,'2020-01-07 00:23:33' as pay_time
)
select user_id,order_id,amt,pay_time
,count(*)over(partition by user_id) as `当前用户订单数`
,count(distinct user_id)over(partition by 1) as `当前用户数`
,sum(amt)over(partition by user_id) as `当前用户总金额`
,sum(amt)over(order by 1) as `总金额`
,sum(amt)over(partition by user_id order by pay_time) as `当前用户截止当前支付时间累计总金额`
,max(amt)over(partition by user_id) as `当前用户最大金额`
,max(amt)over(order by pay_time) as `截止当前成单时间最大成交金额`
,min(amt)over(partition by user_id) as `当前用户最小金额`
,avg(amt)over(partition by user_id) as `当前用户订单均额`
from tmp
user_id   order_id   amt         pay_time        当前用户订单数   当前用户数   当前用户总金额   总金额   当前用户截止当前支付时间累计总金额   当前用户最大金额   截止当前成单时间最大成交金额   当前用户最小金额   当前用户订单均额  
123 d001      20 2020-01-01 00:23:33  4239583320250202098.75
123 d002      25 2020-01-02 00:23:33  4239583345250252098.75
125 d004      39 2020-01-03 00:23:33  42438833543593915109.5
125 d003      15 2020-01-03 00:23:33  42438833543593915109.5
123 d005      250 2020-01-04 00:23:33  423958332952502502098.75
125 d006      25 2020-01-05 00:23:33  424388337935925015109.5
123 d007      100 2020-01-06 00:23:33  423958333952502502098.75
125 d008      359 2020-01-07 00:23:33  4243883343835935915109.5

开窗——分析函数

row_number() 从1开始,顺序生成序列号,如按成绩排名,也可以用于获取某学科成绩第一名,或获取某学科成绩第一名的学员姓名或其他信息等。
row_number() over(partition  by col1 order by col2) as rowid
结果:1,2,3,4
rank() 并列排序,即下一个数字会跳过
rank() over(partition by col1 order by col2) as rowid
结果:1,2,2,4,5
dense_rank() 并列排序,下一个数据不会跳过
dense_rank() over(partition by col1 order by col2) as rowid
结果:1,2,2,3,4
ntile(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。(https://blog.csdn.net/weixin_36190755/article/details/109056534)
ntile不支持rows between,比如 ntile(2) over(partition by col1 order by col2 rows between 3 preceding and current row)。
first_value(col) 当前分组内排序后col第一个值
last_value(col) 当前分组内排序后col最后一个值
lag(col1,n,default) over(partition by col1 order by col2) as up 向前取第n行
lead(col1,n,default) over(partition by col1 order by col2) as down 向后取第n行
cume_dist() 小于等于当前值的行数/分组内总行数。比如,统计小于等于当前薪水的人数,所占总人数的比例
percent_rank() 分组内当前行的rank值-1/分组内总行数-1

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数(Window Function)和聚合函数(Aggregate Function)是在数据库查询语言中经常使用的两种函数,它们的主要区别在于操作的数据范围和结果的返回方式。 函数是一种用于对查询结果进行计算和排序的函数,它可以在一个查询中对不同的行进行分组、排序和计算,并为每一组返回一个结果。函数通常与口(Window)结合使用,口定义了如何划分数据和排序,函数则在这些口上进行计算。函数能够访问整个查询结果集中的数据,并根据指定的口范围进行计算,返回与每一行相关的结果。常见的函数包括排名函数(RANK)、累积函数(SUM、AVG)等。 聚合函数是一种对数据集进行计算并返回单个结果的函数,它对整个数据集进行操作,将多行数据合并成一行,并返回一个聚合结果。聚合函数通常用于对数据进行统计分析和汇总,如计算总和(SUM)、平均值(AVG)、最大值(MAX)、最小值(MIN)等。聚合函数不具备分组的功能,它将所有数据作为一个整体进行计算,返回的结果是整个数据集的一个汇总值。 总结来说,函数用于对查询结果进行分组、排序和计算,并返回与每一行相关的结果;而聚合函数用于对整个数据集进行计算,并返回一个汇总值。两者的主要区别在于操作的数据范围和结果的返回方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值