SQL Server - 带有单个地址的返回表



我对此有些困扰。

我有以下情况:

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 

最新更新