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

问题描述

我有这样的数据,并且没有要分组的id列,例如:

A
B
C
NULL
F
D
R
NULL
R
T
G

预期输出:

ABC
FDR
RTG

解决方法

这是一个孤岛问题。一种选择是使用累积总和来定义组,然后进行聚合-但是我需要用一列来定义行的顺序,我假设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

如果可能有连续的null,则在外部查询中需要一个where子句:

select string_agg(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,count(*)   over(order by id) cnt1,count(val) over(order by id) cnt2
    from mytable
) t
group by cnt1 - cnt2
order by cnt1 - cnt2

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...