SQL 将多行合并在一起 Table

SQL Merge Multiple Rows together Table

我有一个 table 具有以下布局

Row   ID      Name    Notes
1     100     A       Full Text
2     200     B       Full Text
3     300     C       Text part1
4                     Text part2
5                     Text part3
6     400     D       Full Text

某行注释单元格的内容偶尔会填充到其下方的行中(例如,第 3 行在第 4 行和第 5 行中有注释内容。)换句话说,第 3 行是最后一个 'valid'行。我需要将第 4 行和第 5 行的注释内容连接到第 3 行。如何将注释内容合并到一行(第 3 行)并删除不再需要的行(第 4 行和第 5 行)?所以最后的成品会是这样

Row   ID      Name    Notes
1     100     A       Full Text
2     200     B       Full Text
3     300     C       Full Text
6     400     D       Full Text

您可以使用累积 count() 分配组然后聚合:

select row_number() over (order by min(row)) as row,
       min(id) as id, min(name) as name,
       string_agg(text, ' ') within group (order by row) as text
from (select t.*,
             count(id) over (order by row) as grp
      from t
     ) t
group by grp;

编辑:

在旧版本的SQL服务器中,您可以使用:

select min_row, id,
       stuff( (select ' ' + t.notes
               from t t2
               where t2.row >= i.min_row and
                     (t2.row < i.max_row or i.max_row is null)
               for xml path ('')
              ), 1, 1, ''
            ) as notes
from (select id, name, min(row) as min_row, lead(min(row)) over (order by id) as max_row
      from t
      group by by id, name
     ) i;

如果您使用的是 Sql 服务器 2016,那么您可以试试这个查询:

--you are getting NumberGroup (using window function )
with cte as
(
  select *, sum(ID)over(order by Row rows unbounded preceding)NumGr from Table
)

-- using FOR XML PATH to get one row within group (Full text in your case)
select min(Row)Row,
max(ID)ID,max(Name)Name,max(Notes_new)Notes
from
(
 select *, stuff((select ' '+ Notes from cte cte1 where cte1.NumGr=cte2.NumGr 
 FOR XML PATH('')),1,1,'')Notes_new
 from cte cte2
)X
group by NumGr