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

时间:2018-06-17 13:29:38

标签: 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

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

2 个答案:

答案 0 :(得分:1)

如果你没有2017,你可以使用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)

答案 1 :(得分:0)

如果您的DBMS有一个group_concat / listagg功能,那么它很简单

feof()
相关问题