gpt4 book ai didi

sql - 如何使 LAG() 忽略 SQL Server 中的 NULLS?

转载 作者:行者123 更新时间:2023-12-03 15:55:22 26 4
gpt4 key购买 nike

有谁知道如何用字符串替换列中的空值,直到它遇到一个新字符串,然后该字符串替换它下面的所有空值?我有一个看起来像这样的专栏

原始列:

PAST_DUE_COL           
91 or more days pastdue
Null
Null
61-90 days past due
Null
Null
31-60 days past due
Null
0-30 days past due
Null
Null
Null

预期结果栏:
PAST_DUE_COL           
91 or more days past due
91 or more days past due
91 or more days past due
61-90 days past due
61-90 days past due
61-90 days past due
31-60 days past due
31-60 days past due
0-30 days past due
0-30 days past due
0-30 days past due
0-30 days past due

基本上我希望列中的第一个字符串替换它下面的所有空值,直到下一个字符串。然后该字符串将替换它下面的所有空值,直到下一个字符串,依此类推。

最佳答案

SQL Server 不支持 ignore nulls窗口函数的选项,例如 lead()lag() ,这个问题非常适合。

我们可以通过一些间隙和孤岛技术来解决这个问题:

select
t.*,
max(past_due_col) over(partition by grp) new_past_due_col
from (
select
t.*,
sum(case when past_due_col is null then 0 else 1 end)
over(order by id) grp
from mytable t
) t

子查询执行每次找到非空值时递增的窗口总和:这定义了包含非空值后跟空值的行组。

然后,外部使用一个窗口 max()检索每个组中的(唯一)非空值。

这假设一列可用于对记录进行排序(我称之为 id )。

Demo on DB Fiddle :

身份证 | PAST_DUE_COL | grp | new_past_due_col
-: | :-------------- | --: | :--------------
1 |逾期 91 天或以上 | 1 |逾期 91 天或以上
2 |空| 1 |逾期 91 天或以上
3 |空| 1 |逾期 91 天或以上
4 |逾期 61-90 天 | 2 |逾期 61-90 天
5 |空| 2 |逾期 61-90 天
6 |空| 2 |逾期 61-90 天
7 |逾期 31-60 天 | 3 |逾期 31-60 天
8 |空| 3 |逾期 31-60 天
9 |逾期 0-30 天 | 4 |逾期 0-30 天
10 |空| 4 |逾期 0-30 天
11 |空| 4 |逾期 0-30 天
12 |空| 4 |逾期 0-30 天

关于sql - 如何使 LAG() 忽略 SQL Server 中的 NULLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60105702/

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