日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

HiveSQL窗口函数

發(fā)布時(shí)間:2025/4/5 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HiveSQL窗口函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

        • 1.累計(jì)計(jì)算窗口函數(shù)
            • 1).sum(...)over(...)
            • 2).avg(...) over(...)
            • 3.語(yǔ)法總結(jié):
        • 2.分區(qū)排序窗口函數(shù):
          • row_number() over(partition by ...A...order by...B...) 1,2,3,4
          • rank() over(partition by ...A...order by...B...) 1,2,2,4
          • dense_rank() over(partition by ...A...order by...B...) 1,2,2,3
        • 3.分組排序窗口函數(shù)
          • ntile(n) over(......)
        • 4.偏移分析窗口函數(shù)
          • lag(...)over(...),lead(...)over(...)

1、掌握sum(),avg()用于累計(jì)計(jì)算的窗口函數(shù);
2、掌握row_number(),rank()用于排序的窗口函數(shù);
3、掌握ntile()用于分組查詢的窗口函數(shù);
4、掌握l(shuí)ag(),lead()偏移分析窗口函數(shù)

1.累計(jì)計(jì)算窗口函數(shù)

1).sum(…)over(…)

截止某月的數(shù)值

user_trade列名舉例
user_nameAmy,Dennis
piece購(gòu)買(mǎi)數(shù)量
pay_amount支付金額
goods_categoryfood,clothes,book,computer,electronics,shoes
pay_time132265412,時(shí)間戳
dtpartition,‘yyyy-mm-dd’

求2018年每月的支付總額和當(dāng)年累計(jì)支付總額

select a.month,a.pay_amount,sum(a.pay_amount) over(order by a.month) from(select month(dt) month,sum(pay_amount) pay_amountfrom user_tradewhere year(dt)=2018group by month(dt))a;


2017-2018年每月的支付總額和當(dāng)年累積支付總額(如果用上面的方式會(huì)把之前月份的都匯總,無(wú)法實(shí)現(xiàn))

select a.year,a.month,a.pay_amount,sum(a.pay_amount) over(partition by a.year order by a.month) -- over:指定累計(jì)計(jì)算的條件,這里須正確分組 from (select year(dt) year,month(dt) month,sum(pay_amount) pay_amountfrom user_tradewhere year(dt) in (2017,2018)group by year(dt),month(dt))a;

注:
1.partition by 起到分組的作用;
2.order by按照什么順序進(jìn)行累加,升序ASC,降序DESC,默認(rèn)升序
3.常見(jiàn)錯(cuò)誤:分組沒(méi)有限制正確(partition by 后多加了a.month)

2).avg(…) over(…)

2018年每個(gè)月的近三個(gè)月移動(dòng)平均支付金額

select a.month,a.pay_amount,avg(a.pay_amount) over(order by a.month rows between 2 preceding and current row) from (select month(dt)month,sum(pay_amount)pay_amountfrom user_tradewhere year(dt)=2018group by month(dt))a;

說(shuō)明:我們用rows between 2 preceding and current row來(lái)限制計(jì)算移動(dòng)平均的平均范圍,本語(yǔ)句含義是包含本行及前兩行,這個(gè)就是我們題目中要求的近三月的寫(xiě)法

3.語(yǔ)法總結(jié):

sum(…A…) over(partition by …B… order by…C…rows between…D1…and…D2…)
avg(…A…) over(partition by …B… order by…C…rows between…D1…and…D2…)
A:需要被加工的字段名稱
B:分組的字段名稱
C:排序的字段名稱
D:計(jì)算的行數(shù)范圍
rows between unbounded preceding and current row–包括本行和之前所有的行
rows between current row and unbounded following–包括本行和之后所有的行
rows between 3 preceding and current row --包括本行以內(nèi)和前三行
rows between 3 preceding and 1 following–從前三行到下一行(5行)
拓展:
max(…) over(partition by …order by … rows between… and…)
min(…) over(partition by …order by … rows between… and…)

2.分區(qū)排序窗口函數(shù):

這三個(gè)函數(shù)的作用都是返回相應(yīng)規(guī)則的排序序號(hào)

row_number() over(partition by …A…order by…B…) 1,2,3,4
rank() over(partition by …A…order by…B…) 1,2,2,4
dense_rank() over(partition by …A…order by…B…) 1,2,2,3

2019年1月,用戶購(gòu)買(mǎi)商品品類數(shù)量的排名

select user_name,count(distinct goods_category),row_number() over(order by count(distinct goods_category)),rank() over(order by count(distinct goods_category)),dense_rank() over(order by count(distinct goods_category)) from user_trade where substr(dt,1,7)='2019-01' group by user_name;

選擇2019年支付金額排名在第10,20,30名的用戶:

select a.user_name,a.pay_amount,a.rank from(select user_name,sum(pay_amount)pay_amount,rank() over(order by sum(pay_amount)desc)rankfrom user_tradewhere year(dt)=2019group by user_name)awhere a.rank in (10,20,30);

3.分組排序窗口函數(shù)

ntile(n) over(…)

ntile(n) over(partition by…A…order by…B…)
n:切分的片數(shù)
A:分組的字段名稱
B:排序的字段名稱
ntile(n),用于將分組數(shù)據(jù)按照順序切分成n片,返回當(dāng)前切片值
ntile不支持row between,比如ntile(2) over(partition by …order by…rows between 3 preceding and current row)
如果切片不均勻,默認(rèn)增加第一個(gè)切片的分布

將2019年1月份支付用戶,按照支付金額分成5組:

select user_name,sum(pay_amount)pay_amount,ntile(5) over(order by sum(pay_amount) desc)level from user_trade where substr(dt,1,7)='2019-01' group by user_name;

選出2019年退款金額排名前10%的用戶:

user_refund列名舉例
user_nameAmy,Dennis
refund_piece退款件數(shù)
refund_amount退款金額
refund_time134854654,時(shí)間戳
dtpartition,‘yyyy-mm-dd’
select a.user_name,a.refund_amount,a.level from(select user_name,sum(refund_amount)refund_amount,ntile(10) over(order by sum(refund_amount)desc)levelfrom user_refundwhere year(dt)=2019group by user_name)a where a.level=1;

4.偏移分析窗口函數(shù)

lag(…)over(…),lead(…)over(…)

lag和lead分析函數(shù)可以在通一次查詢中取出同一字段的前N行的數(shù)據(jù)(lag)和后N行的數(shù)據(jù)(lead)作為獨(dú)立的列。

在實(shí)際應(yīng)用中,若要用到取今天和昨天的某字段差值時(shí),lag和lead函數(shù)的應(yīng)用就顯得尤為重要。當(dāng)然,
這種操作可以用表的自連接實(shí)現(xiàn),但是lag和lead與left join、right join等自連接相比,效率更高,SQL更簡(jiǎn)潔。

lag(exp_str,offset,defval) over(partition by …order by…)
lead(exp_str,offset,defval) over(partition by …order by…)
– exp_str是字段名稱。
– offset是偏移量,即是上1個(gè)或上N個(gè)的值,假設(shè)當(dāng)前行在表中排在第5行,offset為3,則表示我們所要找的數(shù)據(jù)行就是表中的第2行(即5-3=2)。offset默認(rèn)值為1。
– defval默認(rèn)值,當(dāng)兩個(gè)函數(shù)取上N/下N個(gè)值,當(dāng)在表中從當(dāng)前行位置向前數(shù)N行已經(jīng)超出了表的范圍時(shí),lag()函數(shù)
– 將defval這個(gè)參數(shù)值作為函數(shù)的返回值,若沒(méi)有指定默認(rèn)值,則返回null,那么在數(shù)學(xué)運(yùn)算中,總要給一個(gè)默認(rèn)值才不會(huì)出錯(cuò)。

Alice和Alexander的各種時(shí)間偏移
lag()實(shí)例:

select user_name,dt,lag(dt,1,dt) over(partition by user_name order by dt),lag(dt) over(partition by user_name order by dt),lag(dt,2,dt) over(partition by user_name order by dt),lag(dt,2) over(partition by user_name order by dt) from user_trade where dt>'0'and user_name in ('Alice','Alexander');

注意:已經(jīng)對(duì)人進(jìn)行分組了,所以不會(huì)由Alice偏移到Alexander,否則沒(méi)有意義

lead()實(shí)例:

select user_name,dt,lead(dt,1,dt) over(partition by user_name order by dt),lead(dt) over(partition by user_name order by dt),lead(dt,2,dt) over(partition by user_name order by dt),lead(dt,2) over(partition by user_name order by dt) from user_trade where dt>'0'and user_name in ('Alice','Alexander');


實(shí)例:支付時(shí)間間隔超過(guò)100天的用戶數(shù)

select count(distinct user_name) from(select user_name,dt, --選出每個(gè)人的支付日期lead(dt) over(partition by user_name order by dt) lead_dtfrom user_trade where dt>'0')a --用的是全量,所以用>0where a.lead_dt is not null and datediff(a.lead_dt,a.dt)>100; -- 大的寫(xiě)左邊,小的寫(xiě)右邊

重點(diǎn)練習(xí)
1.每個(gè)城市,不同性別,2018年支付金額最高的top3用戶(使用user_trade和user_info兩個(gè)表)

user_info列名舉例
user_id10001,10002
user_nameAmy,Dennis
sex[male,female]
age[13,70]
citybeijing,shanghai
fistactivetime2019-04-19 15:40:00
level[1,10]
extra1string類型:{“systemtype”:“ios”,“education”:“master”,“marriage_status”:“1”,“phonebrand”:“iphoneX”}
extra2map<string.string>類型: {“systemtype”:“ios”,“education”:“master”,“marriage_status”:“1”,“phonebrand”:“iphoneX”}
user_trade列名舉例
user_nameAmy,Dennis
piece購(gòu)買(mǎi)數(shù)量
price價(jià)格
pay_amount支付金額
goods_categoryfood,clothes,book,computer,electronics,shoes
pay_time2412521561,時(shí)間戳
dtpartition,‘yyyy-mm-dd’
select c.user_name,c.city,c.sex,c.pay_amount,c.rank from(select a.user_name,b.city,b.sex,a.pay_amount,row_number() over(partition by b.city,b.sex order by a.pay_amount desc) rank from(select user_name,sum(pay_amount) pay_amountfrom user_tradewhere year(dt)=2018group by user_name)aleft join user_info b on a.user_name=b.user_name)c where c.rank<=3; -- 使用row_number是因?yàn)樗梢跃_限制可以具體出來(lái)多少行,使用dense_rank和rank都不行

每個(gè)手機(jī)品牌退款金額前25%的用戶(使用user_refund和user_info兩個(gè)表)

user_refund列名舉例
user_nameAmy,Dennis
refund_piece退款件數(shù)
refund_amount退款金額
refund_time123412521,時(shí)間戳
dtpartition,‘yyyy-mm-dd’
select * from (select a.user_name,extra2['b.phonebrand'] as phonebrand,a.refund_amount,ntile(4) over(partition by extra2['b.phonebrand'] order by a.refund_amount desc)levelfrom(select user_name,sum(refund_amount) refund_amountfrom user_refundwhere dt>'0'group by user_name) aleft join user_info b on a.user_name=b.user_name)c where c.level=1;

總結(jié)

以上是生活随笔為你收集整理的HiveSQL窗口函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩免费视频观看 | 亚洲av少妇一区二区在线观看 | 欧美中文字幕一区二区 | 越南毛茸茸的少妇 | 亚洲乱妇老熟女爽到高潮的片 | 日本久久久久 | 久草视频手机在线观看 | 最近高清中文在线字幕在线观看 | 青青草华人在线 | 一区二区三区视频在线免费观看 | 搡老岳熟女国产熟妇 | 美女喷液视频 | 涩涩涩在线观看 | 欧美激情图片 | 黄色a一级视频 | 欧美怡红院视频一区二区三区 | 久久大胆| 熟妇人妻久久中文字幕 | 一区免费在线观看 | 超碰国产一区二区三区 | 日韩伦理一区二区三区 | 日韩国产精品一区 | 国产毛片精品国产一区二区三区 | 午夜免费精品 | 丰满少妇乱子伦精品看片 | 国产精品久久久久精 | 日韩日韩日韩日韩日韩 | 天天操天天做 | 国产我不卡 | 午夜婷婷丁香 | 亚洲欧美日本一区二区 | 一直草 | 日本丰满肉感bbwbbwbbw | 裸体av淫导航 | 日本一级片在线观看 | 午夜片在线 | 在线亚洲+欧美+日本专区 | 国产第三页 | 精品少妇一区二区三区密爱 | 天堂中文8 | 国产激情视频在线观看 | a级在线免费观看 | 国内外成人在线视频 | 嫩草影院在线视频 | 亚洲欧美韩日 | 欧美性一区二区三区 | 亚洲最大av网站 | 色播av | 黄色一级片黄色一级片 | 久久久www免费人成人片 | 一区二区三区在线观看视频 | 色屋永久| 一个人免费在线观看视频 | 日韩亚洲一区二区 | 国产又爽又黄视频 | 成人国产精品免费观看视频 | 免费在线观看毛片视频 | 在线电影一区二区三区 | 男男成人高潮片免费网站 | www激情| 亚洲精品一卡 | 1级av| 18成人免费观看网站下载 | 欧美不在线 | 日本免费中文字幕 | 黄色片免费视频 | 亚洲男同视频 | 国产成人精品电影 | 超碰成人免费电影 | 99国产精品久久久 | 大尺码肥胖女系列av | 美女精品网站 | 亚洲国产精品久久AV | 狠狠干干| 男人晚上看的视频 | 国产极品久久久 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产精品一区网站 | 在线观看精品视频 | 日韩电影一二三区 | 女女互慰揉小黄文 | 99热r| 欧美老熟妇乱大交xxxxx | 成人在线观看18 | 日韩在线一区二区三区 | 亚洲老老头同性老头交j | 日韩中文字幕一区 | 中文天堂资源在线 | youjizz视频 | 99视频只有精品 | 国产ts系列| 九九热视频精品在线观看 | 国产精品91av | 亚洲视频中文字幕 | 久久久久久久九九九九 | 在线观看一区 | 亚州激情视频 | 又黄又骚又爽 | 国产二级一片内射视频播放 |