gpt4 book ai didi

sql - 识别 SQL 中的重复数据组

转载 作者:行者123 更新时间:2023-12-02 00:27:08 25 4
gpt4 key购买 nike

我的问题是如何识别 SQL 表中重复(重复)的数据“组”。我目前正在使用 SQL Server 2005,所以更喜欢基于它或 ansi-sql 的解决方案。

这是一个示例表和预期结果(如下),以解决此问题:

declare @data table (id nvarchar(10), fund nvarchar(1), xtype nvarchar(1))

insert into @data select 'Switch_1', 'A', 'S'
insert into @data select 'Switch_1', 'X', 'B'
insert into @data select 'Switch_1', 'Y', 'B'
insert into @data select 'Switch_1', 'Z', 'B'
insert into @data select 'Switch_2', 'A', 'S'
insert into @data select 'Switch_2', 'X', 'B'
insert into @data select 'Switch_2', 'Y', 'B'
insert into @data select 'Switch_2', 'Z', 'B'
insert into @data select 'Switch_3', 'C', 'S'
insert into @data select 'Switch_3', 'D', 'B'
insert into @data select 'Switch_4', 'C', 'S'
insert into @data select 'Switch_4', 'F', 'B'

(新数据)

insert into @data select 'Switch_5', 'A', 'S'
insert into @data select 'Switch_5', 'X', 'B'
insert into @data select 'Switch_5', 'Y', 'B'
insert into @data select 'Switch_5', 'Z', 'B'

--   id         fund xtype match
-- ---------- ---- ----- ---------
-- Switch_1 A S Match_1
-- Switch_1 X B Match_1
-- Switch_1 Y B Match_1
-- Switch_1 Z B Match_1
-- Switch_2 A S Match_1
-- Switch_2 X B Match_1
-- Switch_2 Y B Match_1
-- Switch_2 Z B Match_1
-- Switch_3 C S
-- Switch_3 D B
-- Switch_4 C S
-- Switch_4 F B

(新结果)

--   Switch_5   A    S     Match_1
-- Switch_5 X B Match_1
-- Switch_5 Y B Match_1
-- Switch_5 Z B Match_1

我只想在全部或全无的基础上进行匹配(即组中的所有记录都匹配另一组中的所有记录 - 而不是部分匹配)。可以使用任何匹配 ID(我在上面使用了 Match_1,但可以是数字等)

在此感谢您的帮助。

(编辑:我想我应该补充一点,每组可以有任意数量的行,而不仅仅是上面示例中显示的 2 行或 4 行 - 而且我也在努力避免游标)

(编辑 2:如果找到多个匹配项,我似乎遇到了问题。当找到多个匹配项时,提供的 SQL 的输出返回 Switch_1 的重复记录。我已相应地更新示例数据. 不确定 Lieven 是否仍在关注这个 - 我也在寻找解决方案,如果找到会发布在这里。)

最佳答案

执行流程如下

  • q:使用 XML PATH 将一个 id 的所有资金和 xtypes 组合成一个字符串施工
  • r:选择一个ROW_NUMBER以及匹配组的相应 ID
  • 通过 LEFT JOINING @datar 选择结果

SQL语句

;WITH q AS (
SELECT DISTINCT d.id
, DuplicateData = STUFF((SELECT ', ' + fund + xtype FROM @data WHERE id = d.id FOR XML PATH('')), 1, 2, '')
FROM @data d
)
, r AS (
SELECT id1 = q1.id
, id2 = q2.id
, rn = ROW_NUMBER() OVER (ORDER BY q1.ID)
FROM q q1
INNER JOIN q q2 ON q1.DuplicateData = q2.DuplicateData AND q1.id < q2.id
)
SELECT id
, fund
, xtype
, match = 'Match_' + CAST(r.rn AS VARCHAR(32))
FROM @data d
LEFT OUTER JOIN r ON d.id IN (r.id1, r.id2)

结果

id         fund xtype match
---------- ---- ----- --------------------------------------
Switch_1 A S Match_1
Switch_1 X B Match_1
Switch_1 Y B Match_1
Switch_1 Z B Match_1
Switch_2 A S Match_1
Switch_2 X B Match_1
Switch_2 Y B Match_1
Switch_2 Z B Match_1
Switch_3 C S NULL
Switch_3 D B NULL
Switch_4 C S NULL
Switch_4 F B NULL

关于sql - 识别 SQL 中的重复数据组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com