首页 > 其他分享 >开窗函数

开窗函数

时间:2023-06-28 10:45:04浏览次数:36  
标签:goods 函数 pay over partition 开窗 cate1 id

开窗函数
开窗函数对一组值进行操作,它不像普通聚合函数那样需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列
开窗函数的语法形式为:函数 + over(partition by <分组用列> order by <排序用列>),表示对数据集按照分组用列进行分区,并且并且对每个分区按照函数聚合计算,最终将计算结果按照排序用列排序后返回到该行。括号中的两个关键词partition by 和order by 可以只出现一个
 

排序开窗函数
① row_number() -- 相同值排名顺延,返回结果1、2、3、4
② rank() -- 相同结果排名相同,后续排名不连续,返回结果为 1、2、2、4
③ dense_rank() -- 相同结果排名相同,后续排名顺延,返回结果为 1、2、2、3
④ ntile(n) -- 分组排名,将数据分为n组并返回对应组号1、2......n
应用场景:
1、获取排名
2、根据排名获取top榜单
3、环比排名变化
1选品库,需要每个品牌销量top3的商品榜单

select yw_goods_id,brand_id,pay_amt_1m,pay_goods_num_1m,
row_number() over (partition by brand_id order by pay_amt_1m Desc) as rk
from dw.goods_item_extends_df
where audit_status in ("1","4")

根据 brand_id 分组,依据pay_amt_1m倒序,取rk<=3
2、选品库,品牌榜销量排行榜

select brand_id ,
max(brand_name),
sum(pay_amt_1m) as gmv,
sum(pay_goods_num_1m) as pay_goods_num,
rank() over (order by sum(pay_amt_1m) Desc ) as rk
from dw.goods_item_extends_df
GROUP BY brand_id


order by 可以是字段也可以是
3、品牌榜销量排行榜,每个品牌取销量 top3 商品

 

select *from
(select brand_id ,
max(brand_name),
sum(pay_amt_1m) as gmv,
sum(pay_goods_num_1m) as pay_goods_num,
rank() over (order by sum(pay_amt_1m) Desc ) as rk
from dw.goods_item_extends_df
GROUP BY brand_id
order by gmv Desc) t1
left join
(select *from
(select brand_id,yw_goods_id,pay_amt_1m,pay_goods_num_1m,
row_number() over (partition by brand_id order by pay_amt_1m Desc) as od
from dw.goods_item_extends_df
where audit_status in ("1","4")) tt
where tt.od <=3 )t2
on t1.brand_id=t2.brand_id
order by t1.rk

聚合开窗函数
① sum() -- 分组求和
② count() -- 分组求总数
③ min() -- 分组求最小值
④ max() -- 分组求最大值
⑤ avg() --分组求均值

select goods_id, cate1_id, cate1_name,pay_goods_num,
sum(pay_goods_num) over(partition by cate1_id,cate1_name order by pay_goods_num desc) as sum1
,sum(pay_goods_num) over(partition by cate1_id,cate1_name ) as sum2
,sum(pay_goods_num) over(partition by Null ) as sum3
from app.kudu_dhu_replay_live_room_goods_merge_mii
where room_id='419629909341880320';

聚合1:
sum(pay_goods_num) over(partition by cate1_id,cate1_name order by pay_goods_num desc)
根据cate1_id,cate1_name分组,将分组中的pay_goods_num依次聚合
聚合2:
sum(pay_goods_num) over(partition by cate1_id,cate1_name )
根据cate1_id,cate1_name分组,将分组中的pay_goods_num整体聚合
聚合1与聚合2两者的差异:
order by 默认统计范围是 rows between unbounded preceding and current row
也就是取当前行数据与当前行之前的数据运算
sum(pay_goods_num) over(partition by cate1_id,cate1_name order by pay_goods_num desc rows between unbounded preceding and unbounded following) as sum
聚合3:
sum(pay_goods_num) over(partition by Null ) as sum3
聚合4:
sum(pay_goods_num) over() as sum3
不分组,将pay_goods_num整体聚合

select goods_id, cate1_id, cate1_name,pay_goods_num
, sum(pay_goods_num) over(partition by cate1_id,cate1_name order by pay_goods_num desc) as sum
, sum(pay_goods_num) over(partition by cate1_id,cate1_name ) as sum2
, sum(pay_goods_num) over(partition by Null ) as sum3
--分组求总数
, count(goods_id) over(partition by cate1_id,cate1_name order by pay_goods_num desc) as count2
, count(goods_id) over(partition by cate1_id,cate1_name ) as count2
, count(goods_id) over(partition by null) as count3
--分组求最小
, min(pay_gmv) over(partition by cate1_id,cate1_name order by pay_gmv desc) as min_pay_gmv1
, min(pay_gmv) over(partition by cate1_id,cate1_name ) as min_pay_gmv2
, min(pay_gmv) over(partition by null ) as min_pay_gmv3
--分组求最大
, max(pay_gmv) over(partition by cate1_id,cate1_name order by pay_gmv desc) as max_pay_gmv1
, max(pay_gmv) over(partition by cate1_id,cate1_name ) as max_pay_gmv2
, max(pay_gmv) over(partition by null) as max_pay_gmv3
--分组求平均
, avg(pay_gmv) over(partition by cate1_id,cate1_name order by pay_gmv desc) as avg1
, avg(pay_gmv) over(partition by cate1_id,cate1_name ) as avg2
, avg(pay_gmv) over(partition by null ) as avg3
from app.kudu_dhu_replay_live_room_goods_merge_mii
where room_id='419629909341880320';


应用场景:
1、数据占比
2、每一条数据较平均值比较
电虎-商品有效GMV占比

移位开窗函数
lag(字段名,n,0) -- 移位开窗函数,表示返回向上第n行指定字段对应数据。其中n代表向上偏移n行,0代表若偏移行数超出表范围则返回0也可以改成其他值,若不写则默认null
lead(字段名,n,0) -- 移位开窗函数,与lag()相反,表示返回向下第n行指定字段对应数据
电虎直播复盘付款GMV 计算时间范围是:本场次的开播时间到下一场次的开播时间(没有下一场取当前时间):
1.根据 live_begin_time 倒序,获取目标场次的排名rk、开播时间live_begin_time
2.判断目标场次的排名rk,若rk=1,取当前时间,
3.判断目标场次的排名rk,若rk>1,取当前时间,取 live_begin_time 倒序 排名rk=rk-1 的数据live_begin_time(下一场的开播时间)
  移位开窗函数 Plain Text     复制代码   select *from ( select live_custom_room_info_id,live_begin_time,live_end_time, lag(live_begin_time,1,now()) over(partition by null order by live_begin_time Desc) as next_begin_time from ods.kudu_eshop_live_custom_room_info_rt where user_no='417857046838104064' ) t1 where t1.live_custom_room_info_id='419388740100018176';   首尾开窗函数
First_Value(),用法是根据Partition By对数据进行分区,如果忽略Partition By ,那么默认整块数据一个区域,然后根据Order By 进行排序,取出第一个值。
last_value() -- 取分组内排序后,截止到当前行,最后一个值 首尾开窗函数
  select goods_id, cate1_id, cate1_name,pay_goods_num,pay_gmv ,first_value(pay_gmv) over(partition by cate1_id,cate1_name order by pay_gmv desc ) as fisrt1 ,first_value(pay_gmv) over() as fisrt2 ,last_value(pay_gmv) over(partition by cate1_id,cate1_name order by pay_gmv desc ) as last1 ,last_value(pay_gmv) over() as last2 from app.kudu_dhu_replay_live_room_goods_merge_mii where room_id='419629909341880320';

标签:goods,函数,pay,over,partition,开窗,cate1,id
From: https://www.cnblogs.com/chenjulin/p/17510773.html

相关文章

  • 去往js函数式编程(8)完
    冻结  如果我们希望避免程序员意外或故意修改对象的可能性,冻结对象是一个有效的解决方案。在对象被冻结之后,任何修改它的尝试都会静默失败。javascript不会报告错误或抛出异常,但也不会修改对象。这种解决方案只有一个问题:冻结对象是一个浅层操作,它仅冻结属性本身,类似于const......
  • 编程初学者入门6_简单分支问题+Java在OJ中实现多组输入sc.hasNextInt()函数
    题目KiKi想知道这学期他的学习情况,BoBo老师告诉他这学期挂的科目累计的学分,根据所挂学分,判断KiKi学习情况,10分以上:很危险(Danger++),4~9分:危险(Danger),0~3:Good。输入描述:一行,一个整数(0~30),表示KiKi挂的科目累计的学分。输出描述:一行,根据输入的挂科学分,输出相应学习情况(Danger+......
  • 主窗口 模式打开窗口 UI刷新的测试
    窗体1定时器,标签,按钮。窗体1打开后,定时器自动运行,定时器每秒时间到,使得标签数值加1,点击按钮会打开窗体2。窗体2以模式方式打开,点击按钮会启动一次通讯请求。1-窗体1定时器,窗体2按钮触发同步通讯,窗体1的标签数值卡住不更新2-窗体1定时器,窗体2按钮触发异步通讯,窗体1的标签......
  • 举例说明 exec() 函数的用法
    举例说明exec()函数的用法━━━━━━━━━━━━━━━━━━━━━━━━━exec()函数可以用于执行一段字符串作为代码,这在某些场景下非常有用。以下是一些exec()函数的用法示例:动态执行Python代码:code_str='print("Hello,World!")'exec(code_str)在这个例子中......
  • lseek函数详解
    1、用lseek计算文件长度ret=lseek(fd,0,SEEK_END);返回值是文件指针距离文件开头的偏移量,也就是文件的长度2、用seek构建空洞文件1、空洞文件就是文件中有一段是空的2、普通文件中间是不能有空的,因为我们write时文件指针是依次从前向后去移动的,不可能绕过前面的直接......
  • fluent材料物性输入的函数选取
    在定义材料的物理属性时,经常会碰到一些函数需要输入,如果是关于温度的函数那么可以进行定义,如果不是温度的函数,则需要使用UDF进行定义,以黏度为例子说明函数输入:黏度的输入有以下几种情况:constant:恒定值温度的函数①分段线性:不同温度段下对应的函数都是线性的②分段多项式:③......
  • Python | 魔法函数`__iter__`的用法
    下面是找到的一个比较好的科学解释:Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__()方法或__getitem__()方法访问。__iter__方法的作用是让对象可以用for…inobj循环遍历,__getitem__()方法是......
  • Python | 魔法函数`__contains__`的用法
    在python的字符串、列表、元组、结合等对象的时候,经常使用in的方法,一个类的对象能够使用in,就是因为这个类实现了__contains__魔法函数如下面的代码,演示了类的对象使用in的情形classStudent():def__init__(self,name):self.name=namedef__contains__(self......
  • Python | 魔法函数`__str__`的用法
    __str__是Python内置函数,用于将对象转换为字符串表示形式。在Python中,每个类都可以重写__str__方法,以便自定义对象的字符串表示形式。当使用print函数将对象输出到控制台时,Python会自动调用对象的__str__方法,将其转换为字符串并输出到控制台。因此,对于一个自定义的类......
  • Python | 魔法函数`__len__`的用法
    在python的字符串、列表等元素的时候经常使用len()方法计算长度,之所以能够使用len()方法,就是因为它的类实现了__len__魔法函数如:classStudent():def__init__(self,name):self.name=namedef__len__(self):returnlen(self.name)s=Student("Jack......