在mysql中如何将ifnull与窗口函数一起使用

hgtggwj0  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(490)

如何在窗口函数中使用ifnull?
假设下面有一个查询结果,lag1只是使用window函数下移的预算列,因此,值为null。但是我想用一个零来替换这个空值,这样我就可以计算预算和lag1之间的差异。

select id, budget,
    lag(budget) over (order by id) as lag1
    from projects;

+----+---------+---------+
| id | budget  | lag1    |
+----+---------+---------+    
|  1 | 1000000 |    NULL |  
|  2 |  100000 | 1000000 |  
|  3 |     100 |  100000 |
+----+---------+---------+

我尝试了以下两个示例,但都不起作用:

select id, budget,
ifnull(lag(budget),0) over (order by id) as lag1
from projects;

select id, budget,
ifnull((lag(budget) over (order by id) as lag1),0)
from projects;
tez616oj

tez616oj1#

我猜你的 mysql 版本低于8.0,因为第二个解决方案已经运行。

select id, budget, ifnull(lag(budget) over (order by id),0) as lag1
from projects;

sqlfiddle公司
如果你 mysql 版本低于8.0,需要在中编写子查询 select 获取行之前的数据 ID 测试DDL

CREATE TABLE projects(
  ID INT,
   budget INT
);
INSERT INTO projects VALUES (1,1000000);
INSERT INTO projects VALUES (2,100000);
INSERT INTO projects VALUES (3,100);

查询

SELECT *,IFNULL((select budget FROM projects t1 WHERE t.id > t1.id order by t1.id desc limit 1 ) ,0) lag1
FROM projects t

[结果]:

| ID |  budget |    lag1 |
|----|---------|---------|
|  1 | 1000000 |       0 |
|  2 |  100000 | 1000000 |
|  3 |     100 |  100000 |

sqlfiddle公司

ktecyv1j

ktecyv1j2#

lag() 最多可接受三个参数。第一个是返回值的表达式。这里只是列名。第二个决定它应该向后看多少行。默认值为1。第三个,对你来说很有趣的,是一个默认值,如果没有找到前一行。
因此,您可以直接在 lag() 电话:

SELECT id,
       budget,
       lag(budget, 1, 0) OVER (ORDER BY id) lag1
       FROM projects;

相关问题