[英]How to combine multiple rows data until next row value is not null in SQL Server
[英]SQL Server place first column data in all rows until next row has some values
我有一个需要根据逻辑取消分组的数据列表,例如需要将同一列数据放置在所有行中,直到下一行具有某些值。
A | NULL
NULL | 1
NULL | 2
NULL | 3
B | NULL
NULL | 4
NULL | 5
我需要像这样的结果:
A | 1
A | 2
A | 3
B | 4
B | 5
因此,基本上第 1 列中的所有空值都需要填充前一行第 1 列不为空的数据。
感谢您的帮助。
假设您有一个排序列,那么对于您的示例数据,您可以使用累积最大值:
select max(col1) over (order by <order col>) as col1,
max(col2) over (order by <order col>) as col2
from t;
max()
实际上可能不是正确的函数——因为假数据可能恰好在增加。 如果是这种情况,您可以改为:
select max(col1) over (partition by oc_col1) as col1,
max(col2) over (partition by oc_col2) as col2
from (select t.*,
max(case when col1 is not null then <order col> end) over (order by <order col>) as oc_col1,
max(case when col2 is not null then <order col> end) over (order by <order col>) as oc_col2
from t
) t;
你真正想要的是lag(ignore nulls)
。 但是,SQL Server(尚)不支持该(标准)功能。
编辑:
您可以在开始时轻松处理单个NULL
值:
select max(col1) over (order by id) as col1,
coalesce(max(col2) over (order by id),
min(col2) over () - 1
) as col2
from t;
这是你的 db<>fiddle。
我使用以下查询自己解决了这个问题,该查询产生了我一直在寻找的结果:
SELECT
T.ID
,COL1 = (SELECT TOP (1) T1.COL1
FROM T AS T1
WHERE T1.ID <= T.ID AND T1.COL1 IS NOT NULL
ORDER BY T1.ID DESC)
,COL2
FROM
T
WHERE
T.COL1 IS NULL
ORDER BY
T.ID
这是工作结果的数据库小提琴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.