mysql的lead函数数据突然变成null了是怎么回事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的lead函数数据突然变成null了是怎么回事相关的知识,希望对你有一定的参考价值。

可能是因为mysql的Lead函数的索引被改变或删除了,导致表中的数据被重置或变更,从而导致Lead函数的数据变成null。此外,如果Lead函数搜索的数据不存在,也会出现null的情况。 参考技术A 导致空指针异常

如果某列存在 NULL 值时,可能会导致 sum(column) 的返回结果为 NULL 而非 0,如果 sum 查询的结果为NULL 就可以能会导致程序执行时空指针异常(NPE),我们来演示一下这个问题。

解决方案:

select ifnull(sum(colunm_name), 0) from table where id>4;

5、增加查询难度

当某列值中有 NULL 值时,在进行 NULL 值或者非 NULL 值的查询难度就增加了。所谓的查询难度增加指的是当进行 NULL 值查询时,必须使用 NULL 值匹配的查询方法,比如 IS NULL 或者 IS NOT NULL 又或者是 IFNULL(cloumn) 这样的表达式进行查询,而传统的 =、!=、<>... 等这些表达式就不能使用了,这就增加了查询的难度

错误的使用方法:

select * from table where colunm_name<>null;

select * from table where colunm_name!=null;

正确的用法:

select * from table where colunm_name is not null;

推荐使用:select * from table where !isnull(colunm_name);避免换行之后影响可读性

6、NULL 不会影响索引

我们用 explain 来分析查询计划,colunm_name 中有 NULL 值也不会影响 MySQL 使用索引进行查询。
参考技术B 你的数据库可能出现了故障,或者有误操作,而导致数据丢失。你应该尝试进行修复,检查你的代码,以及恢复之前的有效数据。你的数据库可能出现了故障,或者有误操作,而导致数据丢失。你应该尝试进行修复,检查你的代码,以及恢复之前的有效数据。

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函数数据突然变成null了是怎么回事的主要内容,如果未能解决你的问题,请参考以下文章

我是将64位的ubuntu 15.04装到了U盘里,UEFI启动的,每次开机用一段时间就死机了是怎

Hive 分析函数lead、lag实例应用

Hive分析函数LAG和LEAD详解

MYSQL lag() 和lead()函数使用介绍

如何用 Oracle 中应用 Lead() 函数的同一列值替换最后一行中的 NULL?

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