日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入解析MySQL的窗口函數

瀏覽:123日期:2023-06-08 19:37:37
目錄一、定義二、語法格式三、分類1、聚合類2、排序類3、偏移分析函數

對一個成熟的數據分析師來說,窗口函數可以大幅提高查詢效率,且SQL代碼優雅。

一、定義

窗口可以理解為記錄集合,窗口函數就是在滿足某種條件的記錄集合上執行的特殊函數。 即:應用在窗口內的函數。

靜態窗口:每條記錄都要在此窗口內執行函數,窗口大小都是固定的。

動態窗口:不同的記錄對應著不同的窗口,這種動態變化的窗口叫滑動窗口。

二、語法格式函數名(字段名) over(子句)

over()括號內若不寫,則意味著窗口函數基于滿足where條件的所有行進行計算。

若括號內不為空,則支持以下語法來設置窗口。

函數名(字段名) over(partition by <要分列的組> order by <要排序的列> rows between <數據范圍>)

數據范圍:

rows between 2 preceding and current row # 取本行和前面兩行rows between unbounded preceding and current row # 取本行和之前所有的行 rows between current row and unbounded following # 取本行和之后所有的行 rows between 3 preceding and 1 following # 從前面三行和下面一行,總共五行 # 當order by后面沒有rows between時,窗口規范默認是取本行和之前所有的行# 當order by和rows between都沒有時,窗口規范默認是分組下所有行(rows between unbounded preceding and unbounded following) 三、分類1、聚合類

聚合窗口函數與普通聚合函數的區別:

普通場景下的聚合函數是將多條記錄聚合為一條**(多到一);**窗口函數是每條記錄都會執行,有幾條記錄執行完還是幾條**(多到多)**。接下來通過解決具體需求來讓大家更加了解窗口函數的用法,希望大家閱讀完能動手練習。 先創建user_trade表:-- 現有2018~2020某電商平臺訂單信息表user_tradecreate table user_trade ( user_name varchar(20) COMMENT '用戶名', piece int COMMENT '購買數量', price double COMMENT '價格', pay_amount double COMMENT '支付金額', goods_category varchar(20) COMMENT '商品品類', pay_time date COMMENT '支付日期');

從navicat中導入以下數據源:

user_trade數據源:https://gitee.com/hu-weiqing/datasource/blob/master/user_trade.xlsx

數據隨機展示10條如下:

累計求和:sum()over()-- 需求1: 查詢出2019年每月的支付總額和當年累積支付總額 select a.mon,a.pay_amount,sum(a.pay_amount) over(order by a.mon) as sum_amountfrom(select month(a.pay_time) as mon,sum(a.pay_amount) as pay_amountfrom user_trade awhere year(a.pay_time) = '2019'group by month(a.pay_time)) a ;-- 需求2:查詢出2018-2019年每月的支付總額和當年累積支付總額select a.*,sum(a.pay_amount) over(partition by a.year order by a.mon) as sum_amountfrom(select year(a.pay_time) as year,month(a.pay_time) as mon,sum(a.pay_amount) as pay_amountfrom user_trade awhere year(a.pay_time) in('2018','2019')group by year(a.pay_time),month(a.pay_time)) a ;

需求1運行結果(部分)

需求2運行結果(部分)

移動平均:avg() over()-- 需求3: 查詢出2019年每個月的近三月移動平均支付金額select a.mon,a.pay_amount,avg(a.pay_amount) over(order by a.mon rows between 2 preceding and current row) as avg_amountfrom(select month(a.pay_time) as mon,sum(a.pay_amount) as pay_amountfrom user_trade awhere year(a.pay_time) = '2019'group by month(a.pay_time)) a ;

需求3運行結果(部分)

最大/最小值:max()/min() over()-- 需求4: 查詢出每四個月的最大月總支付金額select a.mon,a.pay_amount,max(a.pay_amount) over(order by a.mon rows between 3 preceding and current row) as max_amountfrom(select SUBSTRING(a.pay_time,1,7) as mon,sum(a.pay_amount) as pay_amountfrom user_trade agroup by SUBSTRING(a.pay_time,1,7))a ;

需求4運行結果(部分)

2、排序類row_number()、rank() 和dense_rank()-- 需求4: 查詢出每四個月的最大月總支付金額select a.mon,a.pay_amount,max(a.pay_amount) over(order by a.mon rows between 3 preceding and current row) as max_amountfrom(select SUBSTRING(a.pay_time,1,7) as mon,sum(a.pay_amount) as pay_amountfrom user_trade agroup by SUBSTRING(a.pay_time,1,7))a ;

需求5運行結果(部分)

row_number()、rank() 和dense_rank() 三種排序函數的區別:

row_number:每一行記錄生成一個序號,依次排序且不會重復。 12345…

rank:跳躍排序,生成的序號有可能不連續。11345…

dense_rank:在生成序號時是連續的。11234…

ntile(n)over()

ntile(n)用于將分組數據按照順序切分成n片,返回當前切片值. n表示切片的數量; 不支持rows between

-- 需求6: 查詢出將2020年2月的支付用戶,按照支付金額分成5組后的結果select a.user_name,sum(a.pay_amount) as pay_amount,ntile(5) over(order by sum(a.pay_amount) desc) as levelfrom user_trade awhere SUBSTRING(a.pay_time,1,7) = '2020-02'group by a.user_name;-- 需求7: 查詢出2020年支付金額排名前30%的所有用戶select a.user_name,a.pay_amountfrom (select a.user_name,sum(a.pay_amount) as pay_amount,ntile(10) over(order by sum(a.pay_amount) desc) as levelfrom user_trade awhere year(a.pay_time) = '2020'group by a.user_name) a where a.level in(1,2,3);

需求6運行結果(部分)

需求7運行結果(部分)

3、偏移分析函數lag() over()向上偏移

lag(exp_str,offset,defval) exp_str:字段名 offset:偏移量 defval:默認值。當向上偏移了offset行已經超出了表的范圍時,lag()函數將defval這個參數值作為函數的返回值,若沒有指定默認值,則返回NULL。

-- 需求8: 查詢出King和West的時間偏移(前N行)select a.user_name,a.pay_time,lag(a.pay_time,1,a.pay_time) over(partition by a.user_name order by a.pay_time) as lag1,-- 沒有傳入偏移量,那么默認就是1,找不到的話,此處也沒有給默認值,為nulllag(a.pay_time) over(partition by a.user_name order by a.pay_time) as lag2,lag(a.pay_time,2,a.pay_time) over(partition by a.user_name order by a.pay_time) as lag3,lag(a.pay_time,2) over(partition by a.user_name order by a.pay_time) as lag4from user_trade a where a.user_name in('King','West');

需求8運行結果

lead() over()向下偏移

用法同lag()over()函數。

補充練習:

-- 需求9: 查詢出支付時間間隔超過100天的用戶數select count(distinct a.user_name)from (select a.user_name,a.pay_time,lag(a.pay_time) over(partition by a.user_name order by a.pay_time) as lgfrom user_trade a ) a where DATEDIFF(a.pay_time,a.lg) >100;# 需求9運行結果為180-- 需求10: 查詢出每年支付時間間隔最長的用戶select c.years,c.user_name,c.pay_days from(select b.years,b.user_name,datediff(b.pay_time,b.lg) as pay_days,rank() over(partition by b.years order by datediff(b.pay_time,b.lg) desc) as rk from (select year(a.pay_time) as years,a.user_name,a.pay_time,lag(a.pay_time) over(partition by a.user_name,year(a.pay_time) order by a.pay_time) as lgfrom user_trade a ) b where b.lg is not null) c where c.rk = 1;

需求10運行結果

窗口函數在數據分析師的工作中應用非常廣,如果不會窗口函數,很可能同樣的需求用普通表關聯寫需要關聯很多張表,導致性能不好,查詢速度非常慢。

到此這篇關于深入解析MySQL的窗口函數的文章就介紹到這了,更多相關MySQL窗口函數內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
一级成人国产| 三上悠亚国产精品一区二区三区| 亚洲www啪成人一区二区| 国产videos久久| 麻豆精品国产91久久久久久| 国产精品啊v在线| 国产精品大片免费观看| 国产精品密蕾丝视频下载| 国产剧情一区二区在线观看| 国产日产精品_国产精品毛片 | 日韩精品午夜| 另类中文字幕国产精品| 欧美成a人免费观看久久| 日韩精品影视| 在线亚洲国产精品网站| 日韩精品一二三四| 日本va欧美va瓶| 麻豆一区二区三区| 精品日韩视频| 国产精品嫩草99av在线| 色综合视频一区二区三区日韩 | 日本在线成人| 欧美aⅴ一区二区三区视频| 国产一区二区亚洲| 视频小说一区二区| 视频一区二区三区中文字幕| 午夜天堂精品久久久久| 麻豆国产欧美一区二区三区| 欧美羞羞视频| 亚洲一区不卡| 国产精品美女在线观看直播| 神马午夜在线视频| 美女久久精品| 欧美性感美女一区二区| 米奇777超碰欧美日韩亚洲| 免费人成精品欧美精品 | 精品精品99| 国精品一区二区| 日韩一区二区三区精品| 久久av影院| 久久精品动漫| 中文字幕av一区二区三区人| 你懂的网址国产 欧美| 久久裸体视频| 视频一区日韩精品| 成人三级高清视频在线看| 国产综合婷婷| 日本久久二区| 欧洲一级精品| 亚洲精品影视| a国产在线视频| 欧美在线综合| 国产精品日韩精品中文字幕| 欧洲精品一区二区三区| 伊人国产精品| 日韩一区二区中文| 尹人成人综合网| 日韩高清欧美激情| 亚洲天堂1区| 日本a口亚洲| 久久久久91| 亚洲欧美日本国产| 深夜视频一区二区| 欧美亚洲人成在线| 成人久久久久| 国产亚洲人成a在线v网站| 999精品色在线播放| 日韩av网站免费在线| 99国产精品免费视频观看| 日韩国产欧美视频| 欧美特黄视频| 荡女精品导航| 日本成人在线不卡视频| 99热精品久久| 久久av导航| 日韩一区欧美二区| 精品欧美视频| 亚洲精品免费观看| 亚洲h色精品| 国产精品白浆| 亚洲开心激情| 婷婷亚洲综合| 国产在线日韩精品| 日本免费在线视频不卡一不卡二| 久久久精品日韩| 丁香婷婷久久| 国产剧情一区| 日韩av一区二区三区| 乱人伦精品视频在线观看| 性欧美videohd高精| 欧美aaaaaa午夜精品| 快she精品国产999| 欧美1区2区3区| 在线手机中文字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 蜜桃av.网站在线观看| 久久一区亚洲| 国产欧美日韩在线一区二区| 亚洲一区二区小说| 中文日韩欧美| 久久中文视频| 成人午夜国产| 一本大道色婷婷在线| 高清在线一区| 久久久91麻豆精品国产一区| 久久国内精品视频| 蜜臀精品久久久久久蜜臀| 欧美日韩国产在线观看网站| 蜜桃成人精品| 亚洲天堂日韩在线| 国产精品毛片一区二区三区| 一区二区三区四区在线观看国产日韩| 麻豆一区在线| 日韩精选在线| 国产综合婷婷| 日韩在线观看一区二区三区| 欧美va亚洲va日韩∨a综合色| 国产成人精品一区二区三区免费 | 成人看片网站| 久久久9色精品国产一区二区三区| 精品黄色一级片| 国产黄色一区| 影音先锋久久精品| 日本不卡高清视频| 国产色噜噜噜91在线精品| 国产亚洲精品美女久久 | 蜜桃视频在线网站| 日韩精品网站| 亚洲婷婷在线| 亚洲成av人片一区二区密柚| 电影91久久久| 韩国女主播一区二区三区| 久久久免费人体| 精品亚洲成人| jizzjizz中国精品麻豆| 精品一区电影| 成人片免费看| 亚洲小说欧美另类婷婷| 亚洲激情中文在线| 久久午夜视频| 日本午夜精品久久久久| 国产欧美久久一区二区三区| 免费看久久久| 亚洲涩涩在线| 欧美在线亚洲综合一区| 99久久亚洲精品蜜臀| 免费观看久久av| 日韩av不卡一区二区| 日韩伦理一区| 奇米色欧美一区二区三区| 中文在线日韩| 91麻豆精品激情在线观看最新 | 精品中文字幕一区二区三区四区| 国产精品**亚洲精品| 麻豆视频观看网址久久| 成人一二三区| 欧美成人日韩| 亚洲精品无播放器在线播放| 日韩一区二区三区四区五区| 国产精品免费精品自在线观看| 久久精品免费看| 久久婷婷丁香| 一级成人国产| 精品国产成人| 日韩午夜一区| 久久国产免费看| 午夜av不卡| 亚洲欧美日韩国产一区| 欧美在线精品一区| 超碰成人av| 日韩精品一卡二卡三卡四卡无卡| 欧美三区不卡| 日韩大片在线播放| 欧美国产91| 欧美三区不卡| 亚洲91精品| 欧美在线看片| 欧美精品一区二区久久| 91精品麻豆| 黄色在线网站噜噜噜| 亚洲欧美日韩专区| 国产精品www.| 亚洲一级高清| 国产日韩欧美一区在线| 91精品精品| 最新国产精品| 中文在线资源| 日韩在线网址| 国精品产品一区| 丝袜美腿高跟呻吟高潮一区| 免费在线观看一区| 99亚洲视频| 欧美激情网址| 欧美另类专区| 久久久久亚洲精品中文字幕| 国产精品丝袜xxxxxxx| 国产一区二区精品久| 久久福利一区| 中文在线资源| 国产精品日韩精品在线播放|