我对这个问题感到困惑。
我有以下情况:
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。
启动语句答案 0 :(得分:1)
你可以使用一点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;
答案 1 :(得分: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
,这种方法并不总是可行,但由于您说选择哪一行并不重要,这是最简单的方法。
答案 2 :(得分:0)
如果您的权限已设置为只能“...使用选择启动语句”,我认为您无法执行此操作。你需要做这样的事情:
INSERT INTO [final].[table]
([Address]
, [Postcode]
, [Surname])
SELECT [Address]
, [Postcode]
, [Surname]
FROM [Table]
GROUP BY [Address]
, [Postcode]
, [Surname]
HAVING COUNT(*) > 1