gpt4 book ai didi

sql - LAG 函数和 NULL

转载 作者:行者123 更新时间:2023-12-02 23:01:41 27 4
gpt4 key购买 nike

如何告诉 LAG 函数获取最后一个“非空”值?

例如,请参阅下面的表,其中 B 列和 C 列上有一些 NULL 值。我想用最后一个非空值填充空值。我尝试使用 LAG 函数来做到这一点,如下所示:

case when B is null then lag (B) over (order by idx) else B end as B,

但是当我连续有两个或多个空值时,这不太有效(请参阅 C 列第 3 行上的 NULL 值 - 我希望它是原始值 0.50)。

知道如何才能实现这一目标吗?(不一定要使用LAG功能,欢迎任何其他想法)

一些假设:

  • 行数是动态的;
  • 第一个值始终为非空;
  • 一旦我有一个 NULL,直到最后都是 NULL - 所以我想用最新的值填充它。

谢谢

enter image description here

最佳答案

您可以使用outer apply来做到这一点运算符:

select t.id,
t1.colA,
t2.colB,
t3.colC
from table t
outer apply(select top 1 colA from table where id <= t.id and colA is not null order by id desc) t1
outer apply(select top 1 colB from table where id <= t.id and colB is not null order by id desc) t2
outer apply(select top 1 colC from table where id <= t.id and colC is not null order by id desc) t3;

无论空值或空“岛”的数量有多少,这都会起作用。您可能有值,然后是空值,然后又是值,又是空值。它仍然有效。

<小时/>

但是,如果假设(在你的问题中)成立:

Once I have a NULL, is NULL all up to the end - so I want to fill it with the latest value.

有一个更有效的解决方案。我们只需要找到最新的(按 idx 排序时)值。修改上面的查询,删除 where id <= t.id来自子查询:

select t.id,
colA = coalesce(t.colA, t1.colA),
colB = coalesce(t.colB, t2.colB),
colC = coalesce(t.colC, t3.colC)
from table t
outer apply (select top 1 colA from table
where colA is not null order by id desc) t1
outer apply (select top 1 colB from table
where colB is not null order by id desc) t2
outer apply (select top 1 colC from table
where colC is not null order by id desc) t3;

关于sql - LAG 函数和 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36837971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com