首页 > 解决方案 > 使用 SQL 窗口函数填充 1 列值为 0 的行,可能使用行索引的下一个最大/上一个最小值

问题描述

这是测试数据的一次迭代:

DECLARE @trial TABLE (id int)

INSERT INTO @trial (id)
VALUES (0), (0),(3), (0), (0),(0), (7), (0),(9), (0), (0),(12), (0), (0),(15) 

select * from @trial

数字将始终是 0 序列或行号。在任何集合中,如果数字不为零,则数字将始终代表行,因此它将始终增加。

我需要 0 来获取下一个最大值。所以输出应该是这样的:

3
3
3
7
7
7
7
9
9
12
12
12
15
15
15

请帮忙!!

标签: sqlsql-server

解决方案


SQL 表表示无序集。没有排序——也没有累积最大值——除非你有一个指定排序的列。

这很容易通过identity列包含在内。这样的列将保留插入顺序,这显然是您想要的。所以,这就是你想要的:

DECLARE @trial TABLE (id int identity, val int)

INSERT INTO @trial (val)
VALUES (1), (0),(0), (0), (0),(0), (7), (0),(9), (0), (0),(12), (0), (14),(0) 

select * from @trial

select max(val) over (order by id) as running_max
from @trial
order by id;

编辑:

在您的示例数据中,您既要向前看,又要向后看。为此,您可以使用case表达式来查找第一行具有的情况0

select (case when max(val) over (order by id) = 0
             then min(case when val > 0 then val end) over (order by id desc)
             else max(val) over (order by id) 
        end) as running_max
from trial
order by id;

是一个 db<>fiddle。


推荐阅读