T-SQL(SQL Server):提取唯一的数据集/数据组

T-SQL(SQL Server):提取唯一的数据集/数据组,sql,sql-server,Sql,Sql Server,使用T-SQL,我将如何使用SQL从表中提取唯一集。下面是一个示例表: ID Value 1 A 1 B 1 C 2 A 2 B 2 C 3 D 3 E 4 D 4 E 5 X 5 Y 5 Z 6 Q 7 Q 8 Q 9 Q 10 A 在这种情况下,所需结果集将有五个唯一集,如下所示: A B C D E X Y Z Q A 这是我必须转换的传入数据的代表。传入的数据有数百个这样的重复集。识别这些集合具有重大价值

使用T-SQL,我将如何使用SQL从表中提取唯一集。下面是一个示例表:

ID  Value
1   A
1   B
1   C
2   A
2   B
2   C
3   D
3   E
4   D
4   E
5   X
5   Y
5   Z
6   Q
7   Q
8   Q
9   Q
10  A
在这种情况下,所需结果集将有五个唯一集,如下所示:

A
B
C

D
E

X
Y
Z

Q

A

这是我必须转换的传入数据的代表。传入的数据有数百个这样的重复集。识别这些集合具有重大价值;把它们放在一张单独的桌子上;给他们分配一个SetID;然后基于SetID连接将核心数据关联到相关集合;等等。

如果您的DBMS有一个组连接/listag功能,那么它很简单

select distinct group_concat(value order by value)
from tab
group by id

如果没有xml路径,可以使用xml路径。 比如说

drop table t
go
create table t(ID  int ,Value varchar(1));
go
insert into t values
(1 ,  'A'),
(1 ,  'B'),
(1 ,  'C'),
(2 ,  'A'),
(2 ,  'B'),
(2 ,  'C'),
(3 ,  'D'),
(3 ,  'E'),
(4 ,  'D'),
(4 ,  'E'),
(5 ,  'X'),
(5 ,  'Y'),
(5 ,  'Z'),
(6 ,  'Q'),
(7 ,  'Q'),
(8 ,  'Q'),
(9 ,  'Q'),
(10,  'A');
获取一行集合

select  distinct 
        maskdetail = STUFF((
          SELECT ',' + t1.value
          FROM t t1
          WHERE t1.id = t.id
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from t

maskdetail
------------------------------
A
A,B,C
D,E
Q
X,Y,Z

(5 row(s) affected)
获取一列集合

select t.value 
from t 
join
(
select  min(id) minid,maskdetail
from
(
select  distinct t.id,
        maskdetail = STUFF((
          SELECT ',' + t1.value
          FROM t t1
          WHERE t1.id = t.id
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
from t
) s
group by maskdetail
) x
on x.minid = t.id

value
-----
A
A
B
C
D
E
Q
X
Y
Z

(10 row(s) affected)

用您正在使用的数据库标记您的问题。如果你有,比如说,“10A”,这些集合会是什么样子?我应该注意到我使用的是T-SQL,它没有这样的函数。回答得很好。很抱歉我的遗漏。@digest806:好吧,在您必须使用XML plus内容之前,SQLServer 2017中有一个字符串\u AGG:-),例如,既然您已经提到MSSQL 2017,那么不妨通过字符串\u AGG;)演示如何执行此操作。)