sql - 使用 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
请帮忙!!
解决方案
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。