如何组合多行数据,直到下一行值在 SQL Server 中不为空

Posted

技术标签:

【中文标题】如何组合多行数据,直到下一行值在 SQL Server 中不为空【英文标题】:How to combine multiple rows data until next row value is not null in SQL Server 【发布时间】:2020-08-13 09:59:18 【问题描述】:

我有这样的数据,没有id列可以分组,例如:

A
B
C
NULL
F
D
R
NULL
R
T
G

预期输出:

ABC
FDR
RTG

【问题讨论】:

。 .除非您有一个指定顺序的列,否则您的问题毫无意义。 SQL 表表示 无序 集。 是否可以使用指定每个组的行号更新一个额外的列,如下所示。 A 1、B 1、C 1、NULL 1、F 2、D 2、R 2 等。 【参考方案1】:

这是一个孤岛问题。一个选项使用累积和来定义组,然后是聚合 - 但您需要一个定义行顺序的列,我假设 id

select string_agg(val, '') within group (order by id) vals
from (
    select 
        val,
        sum(case when val is null then 1 else 0 end) over(order by id) grp
    from mytable
) t
group by grp
order by grp

如果可能有连续的nulls,那么你需要在外层查询中有一个where子句:

select string_agg(val, '') within group (order by id) vals
from (
    select 
        val,
        sum(case when val is null then 1 else 0 end) over(order by id) grp
    from mytable
) t
where val is not null 
group by grp
order by grp

您还可以使用窗口计数来构建组:

select string_agg(val, '') within group (order by id) vals
from (
    select 
        val,
        count(*)   over(order by id) cnt1,
        count(val) over(order by id) cnt2
    from mytable
) t
group by cnt1 - cnt2
order by cnt1 - cnt2

【讨论】:

MSSQL Server 2014

以上是关于如何组合多行数据,直到下一行值在 SQL Server 中不为空的主要内容,如果未能解决你的问题,请参考以下文章

SQL一行多列数据分解成多行数据

如何将多行组合在一行中,oracle

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

sql如何把行拆分为几行

sql一行拆分多行记录

SQL 语句 如何把多行数据放入一行显示 比如: