电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

深入解析MySQL的窗口函數

瀏覽:29日期: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 數據庫
相關文章:
主站蜘蛛池模板: 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 食安观察网| 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 河南新乡德诚生产厂家主营震动筛,振动筛设备,筛机,塑料震动筛选机 | 铝镁锰板_铝镁锰合金板_铝镁锰板厂家_铝镁锰金属屋面板_安徽建科 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 深圳高新投三江工业消防解决方案提供厂家_服务商_园区智慧消防_储能消防解决方案服务商_高新投三江 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 浙江皓格药业有限公司| 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 数码管_LED贴片灯_LED数码管厂家-无锡市冠卓电子科技有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 大型低温冷却液循环泵-低温水槽冷阱「厂家品牌」京华仪器_京华仪器 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 定时排水阀/排气阀-仪表三通旋塞阀-直角式脉冲电磁阀-永嘉良科阀门有限公司 | 论文查重_免费论文查重_知网学术不端论文查重检测系统入口_论文查重软件 | 筛分机|振动筛分机|气流筛分机|筛分机厂家-新乡市大汉振动机械有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 磁力抛光机_磁力研磨机_磁力去毛刺机_精密五金零件抛光设备厂家-冠古科技 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 深圳APP开发公司_软件APP定制开发/外包制作-红匣子科技 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 |