繁体   English   中英

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 列不为空的数据。

SQL小提琴

感谢您的帮助。

假设您有一个排序列,那么对于您的示例数据,您可以使用累积最大值:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM