SQL Server - 具有单个地址的重复数据删除和返回表

时间:2017-12-08 17:05:50

标签: sql sql-server duplicates

我对这个问题感到困惑。

我有以下情况:

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。

启动语句

3 个答案:

答案 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