SQL将多行合并在一起的表

问题描述

我有一张桌子,其布局如下

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

偶尔将行的Notes单元格的内容填充到其下方的行中(例如,第3行的第4行和第5行具有注释内容)。换句话说,第3行是最后一个“有效”行。我需要将注释内容从第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 Server中,您可以使用:

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,''
            ) 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 Server 2016,则可以尝试以下查询:

INSERT OVERWRITE INTO MY_DB.DAILY_TABLE (
  CUST_NUM
)
SELECT C.CUST_NUM
  FROM MY_DB.CUSTOMER_TABLE C
       CROSS JOIN MY_DB.THRESHOLD_TABLE T
 WHERE T.RUN_DT = CURRENT_DATE()
QUALIFY ROW_NUMBER() OVER (ORDER BY RANDOM()) <= T.MAX_ROWS
;