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 执行结果

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

  1. MySQL多行数据合并(单例显示多个值)之GROUP_CONCAT()函数(字符串连接函数)

    MySQL多行数据合并之GROUP_CONCAT函数 一.GROUP_CONCAT函数语法 二.创建表和添加测试数据 1.建表 2.添加测试数据 三.编写测试SQL语句 1.人员信息表(左)和房间信息 ...

  2. docker仓库mysql所有版本_Docker 安装 MySQL8.0

    环境:MacOS_Cetalina_10.15.1.Mysql8.0.18.Docker_2.0.0.3 1.docker仓库搜索mysql docker search mysql 2.docker仓 ...

  3. mysql 自定义数据_MySQL数据库自定义变量@的用法与常用案例

    很久没有写文章,最近碰到了一个非常有意思的Oracle SQL 案例,这个案例,我用了一些窗口函数来解决的,后来想想,能否跟MySQL有所关联,就用一个SQL,总结了@的常用用法. 首先我们看下,如下 ...

  4. mysql 角色(role)管理功能实现、创建role,role权限赋值、激活(基于mysql8.0)

    以下操作都是基于mysql8.0的来实现的,电脑安装不上mysql 8.0的,请自行安装升级 创建角色(role) 将role的权限赋值给一个用户 查看用户被授权情况并激活权限!!重点,不然赋权之后用 ...

  5. MYSQL(mysqld --initialize --console初始化的时候报错:Can‘t create directory ‘C:\web\mysql-8.0.11\data\‘)

    标题MYSQL安装报错 原因:在MYSQL (mysqld --initialize --console)初始化的时候报错: mysqld: Can't create directory 'C:\we ...

  6. python对文件每行数据计算_如何在python中对pandas数据帧的每一行进行计算?

    我是python的新手,我正在尝试将我在R中创建的函数转换为python,R函数描述如下: 从我的阅读来看,在python中实现这一点的最佳方法是使用一个for循环,该循环采用以下形式for line ...

  7. pb9数据窗口中显示行数据与当前行区别_Hive的窗口函数

    聚合函数(如sum().avg().max()等等)是针对定义的行集(组)执行聚集,每组只返回一个值. 窗口函数也是针对定义的行集(组)执行聚集,可为每组返回多个值.如既要显示聚集前的数据,又要显示聚 ...

  8. mysql 无线网络设置_操作mysql命令行的方法步骤

    操作mysql命令行的方法步骤 现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对大家有所帮助. 登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直 ...

  9. 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据

    C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...

最新文章

  1. swift支持多线程操作数据库类库-CoreDataManager
  2. CTO怒了:“如果中台不省钱,我建个屁中台啊!”
  3. php7-fpm webtatic,如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud
  4. 详解浏览器解析一个URL的全过程
  5. 基于matlab的图解粒度参数计算,基于MATLAB的图解粒度参数计算-热带地理.PDF
  6. QDU-GZS and String
  7. 高级数据结构---并查集
  8. java设计模式迭代器模式_Java中的迭代器设计模式–示例教程
  9. thinking in java -- notes-2
  10. 彻底搞懂四元数(转载)
  11. gridview 默认编辑按钮改成图片
  12. Creative Groove Randomizer插件:Audiomodern Playbeat节拍生成器
  13. eclipse对mysql进行增删改查_用eclipse编写的 能对MySQL数据库中表实现增删改查功能...
  14. 对sql文件进行读取并通过JDBC批量执行
  15. java keytool 生成p12证书
  16. ES6--阮一峰版笔记
  17. 80端口为什么要备案_成都为什么要登记icp备案需要多久
  18. 超好用的在线思维导图网站
  19. ruby 中的sort 和 sort_by
  20. Android 源码 图形系统之请求布局

热门文章

  1. VTK:使用 vtkPolyData 结构为单元格分配颜色查找表用法实战
  2. VTK:vtkPlotArea用法实战
  3. OpenCASCADE绘制测试线束:几何命令之展示
  4. boost::serialization模块指针反序列化的安全异常处理示例
  5. 使用 Boost.Multiprecision 来实现高精度高斯-拉盖尔正交积分
  6. boost::mpl模块实现quote相关的测试程序
  7. boost::iterator::permutation_iterator用法的测试程序
  8. GDCM:gdcm::UIComp的测试程序
  9. ITK:二进制XOR两个图像
  10. DCMTK:从ASCII转储创建DICOM FileFormat或DataSet