sql - 如何选择按组 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'
解决方案
我认为递归 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。
推荐阅读
- oauth-2.0 - 为什么我们需要 OIDC ID Token?
- mysql - MYSQL 根据多个条件返回所有字段,并且在单个列上不同,但是
- r - 错误:使用 fscaret 进行特征选择时,$ 运算符对原子向量无效(包装器方法)
- java - 解决了!- Spring boot:获取 415 不支持的媒体类型
- python - 使用 ULMFiT 和 Python 中的 fastai 库进行文本分类 (NLP)
- gitlab - GitLab: stores large objects (LFS) outside of lfs_storage_path
- java - Why doesn't SpyPostProcessor implement getEarlyBeanReference() like AbstractAutoProxyCreator,it may cause circular reference Exception
- python - 禁用 python 问候/版本信息
- java - JDK version 1.8 in the system but JDK 11 on VScode
- node.js - Connection Not established in Mocha to MongoDB Atlas