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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0

發布時間:2024/9/27 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mysql相鄰數據(行)計算的自定義變量與Lead Lag窗口函數的案例

1 相鄰行

我們在處理數據時有時需要對業務上定義的相鄰行進行統計計算。 比如我們想統計公司里所有部門最近2年或相鄰年份)的成本差(這里假定公司每個部門每年的成本數據是逐行存取的),這就是典型的相鄰行求解問題,因為我們拿到的數據是逐行的,但是我們需要知道指定排序規則后相鄰的下行數據,以便實現最終需求。

當前演示示例僅取某個指定排列規則里的第1、2名的差。

2 代碼示例

2.1 表結構與數據

-- #1創建表并初始化數據,用戶表(員工編號、部門編號、工資、加入時間) DROP TABLE IF EXISTS emp_shenliang2025; CREATE TABLE emp_shenliang2025(empid INT ,deptid INT ,salary DECIMAL(10,2),joindate DATETIME );INSERT INTO emp_shenliang2025 VALUES (1,10,5500.00,'2021-05-18 05:12:39'), (2,10,4500.00,'2021-07-22 07:32:03'), (3,20,1900.00,'2021-03-28 22:57:16'), (4,20,4800.00,'2021-02-20 02:41:05'), (5,40,6500.00,'2021-06-19 18:32:38'), (6,40,14500.00,'2021-04-17 01:32:11'), (7,40,44500.00,'2021-02-12 02:32:13'), (8,50,6500.00,'2021-07-04 19:32:37'), (9,50,7500.00,'2021-02-27 23:12:18'), (10,50,2500.00,'2021-05-10 06:32:57'); SELECT * FROM emp_shenliang2025;

?

2.2 代碼演示

取每個部門里加入最晚(加入時間最大)、次晚的時間差

-- 方法1 Mysq 5.7及以下版本,用@自定義變量 -- #2 編寫獲取分組時間最大、次最大時間差(精度到日)SQL SELECT A.deptid,B.joindate joindate,A.joindate predate,TIMESTAMPDIFF(day,B.joindate,A.joindate) diff_day FROM(select deptid,MAX(joindate) joindate from emp_shenliang2025 AGROUP BY deptid)A JOIN(SELECT deptid,joindate FROM(select empid,deptid,joindate,rank from (select heyf_tmp.empid,heyf_tmp.deptid,heyf_tmp.joindate,@rownum := @rownum+1 ,if(@pdept= heyf_tmp.deptid,@rank:=@rank +1, @rank:= 1) as rank,@pdept:=heyf_tmp.deptidfrom ( select empid,deptid,joindate from emp_shenliang2025 -- order by deptid asc ,salary desc -- select empid,deptid,salary from emp_t10_tmp) heyf_tmp ,(select @rownum:=0 , @pdept:= null ,@rank:= 0) aorder by deptid asc ,joindate desc) result)filterWHERE rank =2)B ON A.deptid = B.deptid-- 方法2 Mysql 8及以上版用Lead(LAG)窗口函數 SELECT deptid,A.joindate,A.pre_date, TIMESTAMPDIFF(day,A.pre_date,A.joindate) diff_day FROM ( SELECT *,Lead(joindate,1)OVER(PARTITION BY deptid ORDER BY joindate DESC) as pre_date, -- LAG(joindate,1)OVER(PARTITION BY deptid ORDER BY joindate DESC) as next_date,ROW_NUMBER()OVER(PARTITION BY deptid ORDER BY joindate DESC) rn FROM emp_shenliang2025 )A WHERE rn = 1

2.3 執行結果

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。