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 执行结果
mysql相邻行数据计算的自定义变量@和Lead窗口函数的具体案例适应版本mysq5.7 mysql8.0相关推荐
- MySQL多行数据合并(单例显示多个值)之GROUP_CONCAT()函数(字符串连接函数)
MySQL多行数据合并之GROUP_CONCAT函数 一.GROUP_CONCAT函数语法 二.创建表和添加测试数据 1.建表 2.添加测试数据 三.编写测试SQL语句 1.人员信息表(左)和房间信息 ...
- 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仓 ...
- mysql 自定义数据_MySQL数据库自定义变量@的用法与常用案例
很久没有写文章,最近碰到了一个非常有意思的Oracle SQL 案例,这个案例,我用了一些窗口函数来解决的,后来想想,能否跟MySQL有所关联,就用一个SQL,总结了@的常用用法. 首先我们看下,如下 ...
- mysql 角色(role)管理功能实现、创建role,role权限赋值、激活(基于mysql8.0)
以下操作都是基于mysql8.0的来实现的,电脑安装不上mysql 8.0的,请自行安装升级 创建角色(role) 将role的权限赋值给一个用户 查看用户被授权情况并激活权限!!重点,不然赋权之后用 ...
- 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 ...
- python对文件每行数据计算_如何在python中对pandas数据帧的每一行进行计算?
我是python的新手,我正在尝试将我在R中创建的函数转换为python,R函数描述如下: 从我的阅读来看,在python中实现这一点的最佳方法是使用一个for循环,该循环采用以下形式for line ...
- pb9数据窗口中显示行数据与当前行区别_Hive的窗口函数
聚合函数(如sum().avg().max()等等)是针对定义的行集(组)执行聚集,每组只返回一个值. 窗口函数也是针对定义的行集(组)执行聚集,可为每组返回多个值.如既要显示聚集前的数据,又要显示聚 ...
- mysql 无线网络设置_操作mysql命令行的方法步骤
操作mysql命令行的方法步骤 现在向大家介绍mysql命令行下,从数据库的建立到表数据的删除全过程,希望对大家有所帮助. 登陆mysql 打cmd命令终端,如果已经添加了mysql的环境变量,可以直 ...
- 输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
C程序,功能如题,代码如下: /* 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据 基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待 */ #include ...
最新文章
- swift支持多线程操作数据库类库-CoreDataManager
- CTO怒了:“如果中台不省钱,我建个屁中台啊!”
- php7-fpm webtatic,如何在 CentOS 7 中使用 Nginx 和 PHP7-FPM 安装 Nextcloud
- 详解浏览器解析一个URL的全过程
- 基于matlab的图解粒度参数计算,基于MATLAB的图解粒度参数计算-热带地理.PDF
- QDU-GZS and String
- 高级数据结构---并查集
- java设计模式迭代器模式_Java中的迭代器设计模式–示例教程
- thinking in java -- notes-2
- 彻底搞懂四元数(转载)
- gridview 默认编辑按钮改成图片
- Creative Groove Randomizer插件:Audiomodern Playbeat节拍生成器
- eclipse对mysql进行增删改查_用eclipse编写的 能对MySQL数据库中表实现增删改查功能...
- 对sql文件进行读取并通过JDBC批量执行
- java keytool 生成p12证书
- ES6--阮一峰版笔记
- 80端口为什么要备案_成都为什么要登记icp备案需要多久
- 超好用的在线思维导图网站
- ruby 中的sort 和 sort_by
- Android 源码 图形系统之请求布局
热门文章
- VTK:使用 vtkPolyData 结构为单元格分配颜色查找表用法实战
- VTK:vtkPlotArea用法实战
- OpenCASCADE绘制测试线束:几何命令之展示
- boost::serialization模块指针反序列化的安全异常处理示例
- 使用 Boost.Multiprecision 来实现高精度高斯-拉盖尔正交积分
- boost::mpl模块实现quote相关的测试程序
- boost::iterator::permutation_iterator用法的测试程序
- GDCM:gdcm::UIComp的测试程序
- ITK:二进制XOR两个图像
- DCMTK:从ASCII转储创建DICOM FileFormat或DataSet