我对此有些困扰。
我有以下情况:
Table
----------------------------------------
ID | Street | Zipcode | Surname
----------------------------------------
001 |Summer Street 2 | 0001 | Smith
002 |Summer Street 2 | 0001 | Smith
003 |Winter Street 1 | 0002 | Muller
004 |Autumn Street 5 | 0004 | Jones
005 |Winter Street 1 | 0002 | Muller
最终表应该脱颖而出,选择哪个重复ID并不重要:
----------------------------------------
ID | Street | Zipcode | Surname
----------------------------------------
001 |Summer Street 2 | 0001 | Smith
003 |Winter Street 1 | 0002 | Muller
004 |Autumn Street 5 | 0004 | Jones
我能够通过以下语句选择所有重复项,然后将其存储在另一个语句中。但是我不知道如何从这里继续前进到所需的最后一张桌子。我也有一种感觉,最终使用三张桌子是一个肮脏的解决方案。
SELECT
Address,
Postcode,
Surname
FROM
Table
GROUP BY
Address,
Postcode,
Surname
HAVING
COUNT(*) > 1
重要的是要知道我只允许使用SELECT。
您可以使用一个小CTE"魔术":
WITH Dups AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY [Address], Postcode, Surname
ORDER BY ID) AS RN
FROM YourTable)
SELECT *
FROM Dups
WHERE RN = 1;
假设它们始终是完美的重复项,除了ID
,只需在ID
上使用聚合来选择其中一个行。例如MIN()
:
SELECT MIN(ID) ID, Address, Postcode, Surname
FROM Table
GROUP BY Address, Postcode, Surname
编辑:一些额外的解释:
重复行的唯一区别是ID
列,否则它们相同。如果您使用聚合函数,例如选择最小值的MIN()
,而GROUP BY
其他列,则您将不再在结果集中重复。
这些行:
001 |Summer Street 2 | 0001 | Smith
002 |Summer Street 2 | 0001 | Smith
将分组并卷到此行:
001 |Summer Street 2 | 0001 | Smith
因为001
是两者之间的MIN(ID)
。
注意:如果您需要特定的ID
,这种方法并非总是可以的,但是由于您说选择哪一行没关系,这是最简单的方法。
如果您设置了权限,以便您只能" ...使用select"我不相信您可以做到这一点。您需要做这样的事情:
INSERT INTO [final].[table]
([Address]
, [Postcode]
, [Surname])
SELECT [Address]
, [Postcode]
, [Surname]
FROM [Table]
GROUP BY [Address]
, [Postcode]
, [Surname]
HAVING COUNT(*) > 1