删除重复项并模拟 group_concat 对结果进行排序

Posted

技术标签:

【中文标题】删除重复项并模拟 group_concat 对结果进行排序【英文标题】:Removing duplicates and sort results emulating group_concat 【发布时间】:2011-09-18 03:32:55 【问题描述】:

我已经找到了这个有趣的话题

Simulating group_concat mysql function in Microsoft SQL Server 2005?

use test
go
create table methods (
id int identity,
id_exam int,
method int
)
go
insert into methods (id_exam,method) values (1,5)
insert into methods (id_exam,method) values (1,2)
insert into methods (id_exam,method) values (1,5)
insert into methods (id_exam,method) values (2,1)
insert into methods (id_exam,method) values (3,5)
insert into methods (id_exam,method) values (3,2)
insert into methods (id_exam,method) values (3,2)
insert into methods (id_exam,method) values (4,5)
insert into methods (id_exam,method) values (4,3)

select 
id_exam, 
method = replace ((select method AS [data()]
                   from methods
                   where id_exam = a.id_exam                      
                   order by id_exam for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

这给了我

1   5,2,5
2   1
3   5,2,2
4   5,3

但是我想从每个考试中删除重复项并对连接的结果进行排序以获得

1  2,5
2  1
3  2,5
4  3,5

谢谢。

【问题讨论】:

【参考方案1】:

尝试在内部查询中使用 DISTINCT 并按方法而不是 id_exam 排序。

select 
id_exam, 
method = replace ((select distinct method AS [data()]
                   from methods
                   where id_exam = a.id_exam                      
                   order by method for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

【讨论】:

【参考方案2】:

group by method 添加到内部查询并将order by id_exam 更改为order by method

select 
id_exam, 
method = replace ((select method AS [data()]
                   from methods
                   where id_exam = a.id_exam
                   group by method                      
                   order by method for xml path('')), ' ', ',')
from  methods a
where id_exam is not null
group by id_exam

结果:

id_exam     method
----------- ---------
1           2,5
2           1
3           2,5
4           3,5

【讨论】:

以上是关于删除重复项并模拟 group_concat 对结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

删除“case when”中的重复项并计算步骤之间的平均值

C#ArrayList重复数据删除

循环没有捕获重复项并在 Android(Java) 中删除它们

Excel删除重复数据及用公式筛选重复项并标记颜色突出显示

处理字符串列表以删除重复项并添加相应的值

SQL 查询 - 组合两个表,删除重复项并仅保留最新的日期