mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 A
GROUP 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.deptid
from (
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) a
order by deptid asc ,joindate desc
) result
)filter
WHERE 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 执行结果
以上是关于mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 获取相邻两条记录的值 lead over 和 lag over(案例:计算相邻两条记录的差值)
Oracle 获取相邻两条记录的值 lead over 和 lag over(案例:计算相邻两条记录的差值)