我在尝试解析一组数据时遇到问题,这些数据包含一个或多个值的列,这些值由";"组合而成。这是一个示例(记住我没有设置这个数据配置,我只需要处理它):
Create Table #testData
(
team varchar(20),
sdate datetime,
unqKeys varchar(max)
)
Insert Into #testData values ('1','2/1/2017','abcd123;qazwsx123');
Insert Into #testData values ('1','2/1/2017','qweasd123');
Insert Into #testData values
('1','3/1/2017','qweasd123;564plmnko;poilkj765');
Insert Into #testData values ('2','2/1/2017','ug56ogth4;uhntg456f');
Insert Into #testData values ('2','4/1/2017','fghrty987');
Insert Into #testData values ('2','4/1/2017','ertdfg546;werstf234;qweasd123');
Select * From #testData
我需要看到的是[team]在[unqKeys]列中具有重复值的位置。我曾尝试在unqKeys上使用COALESCE,但我无法按团队对它们进行分组。我需要一种方法来组合一个团队的所有unqKeys,然后逐步检查列表检查重复项。由于这是SQL Server 2012,我没有split_string
功能,但我确实试图使其成功,但我仍然没有将它们与团队ID相结合。
在上面的例子中,我需要看到一个积极的发现:
team | dupKeys
---- -------
1 qweasd123
这是因为unqKey存在于不同团队的多个记录中。
我已经尝试选择团队并合并unqKey但是这会因为组合的unqKey不是聚合的一部分而失败,如果添加,我只是得到结果,就像你在示例中看到的那样。我试图使用我的分割功能,但后来我失去了与团队的关联,但得到了一个包含所有unqKeys的表。
使用@xQbert评论和链接的解决方案:
--Shows the data
Select * From #testData
--Showing the failure
Select Distinct b.team, b.uKey as dupKey from (
Select a.team
,split.a.value('.','nvarchar(50)') as uKey
From (
Select team
,Cast('<u>' + REPLACE(unqKeys, ';','</u><u>') + '</u>' as XML) as uKey
From #testData
) as a CROSS APPLY uKey.nodes ('/u') as split(a)
) as b
Group By b.team, b.uKey
Having Count(*) > 1