首页 > 解决方案 > 如何选择按组 ID 分隔的多个范围

问题描述

我需要为表中的每个组 id 创建一个逗号分隔的值列表并填写任何缺失值,但我不太确定如何继续。我正在使用服务器 2016。

我的桌子:

  id  |  group_id  |  value  
------+------------+---------
   1  |         1  |    15
   2  |         1  |    16
   3  |         1  |    20
   4  |         2  |    12
   5  |         2  |    15
   6  |         3  |     8

预期输出:

 group_id  |         list
-----------+-----------------------
        1  |  '15,16,17,18,19,20'
        2  |  '12,13,14,15'
        3  |  '8'

标签: sqlsql-servertsqlsql-server-2016

解决方案


我认为递归 CTE 是一个很好的方法:

with t as (
      select v.*
      from (values (1, 1, 15),
                   (2, 1, 16),
                   (3, 1, 20),
                   (4, 2, 12),
                   (5, 2, 15),
                   (6, 3, 8)
           ) v(  id, group_id, value )
     ),
     cte as (
      select t.group_id, min(t.value) as value, max(t.value) as maxvalue, convert(varchar(max), min(t.value)) as vals, 1 as lev
      from t
      group by t.group_id
      union all
      select cte.group_id, value + 1, maxvalue, concat(vals, ',', value + 1), lev + 2
      from cte
      where value < maxvalue
     )
select cte.group_id, cte.vals
from (select cte.*, max(cte.lev) over (partition by cte.group_id) as maxlev
      from cte
     ) cte
where lev = maxlev
order by group_id;

是一个 db<>fiddle。


推荐阅读