【问题标题】:How to return one row from group by multiple columns如何从多列分组中返回一行
【发布时间】:2013-08-13 12:00:46
【问题描述】:

我正在尝试从数据库中提取唯一客户列表,其中一些客户被多次列出。存在(几乎)重复的行是因为客户已从一个部门转移到另一个部门,或者因为客户已使用另一个地址(或两者)注册。

所以我的挑战在于看起来像这样的数据:

ID   Customer   Division   Address
-----------------------------------
1    A          M          X
1    A          L          X
2    B          N          Y
2    B          N          Z
3    C          P          W
3    C          T          S

我希望我的 select 语句为每个客户返回一行(我不在乎哪一个)。

ID   Customer   Division   Address
-----------------------------------
1    A          M          X
2    B          N          Y
3    C          P          W

我使用的是 SQL Server 2008。我想我需要对最后两列进行“GROUP BY”,但我不知道如何只从中取出一行。

希望有人能帮帮我!

(是的,我知道问题应该从源头上解决,但不幸的是,这在任何合理的时间范围内都是不可能的......)。

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案1】:
    select ID, Customer,Division, Address from 
    (
    SELECT 
    ID, Customer,Division, Address,
    ROW_NUMBER() OVER (PARTITON BY Customer Order by Id) as RN
    FROM T
    ) t1
    WHERE RN=1
    

    【讨论】:

    • 这解决了我的问题。非常感谢,瓦莱克斯!我想我 - 几乎 - 了解它是如何工作的。 “t1”让我想知道?那有什么作用?它只是一个变量来保存子选择还是?
    • @Peter_DK T1 是内部子查询的别名。
    【解决方案2】:

    试试这个 -

    DECLARE @temp TABLE
    (
          ID INT
        , Customer CHAR(1)
        , Division CHAR(1)
        , [Address] CHAR(1)
    )
    
    INSERT INTO @temp (ID, Customer, Division, [Address])
    VALUES 
        (1, 'A', 'M', 'X'),
        (1, 'A', 'L', 'X'),
        (2, 'B', 'N', 'Y'),
        (2, 'B', 'N', 'Z'),
        (3, 'C', 'P', 'W'),
        (3, 'C', 'T', 'S')
    
    SELECT t.id
         , t.Customer
         , t.Division
         , t.[Address]
    FROM
    (
        SELECT *
             , rn = ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY 1/0)
        FROM @temp
    ) t
    WHERE T.rn = 1
    
    SELECT ID, Customer, Division = MAX(Division), [Address] = MAX([Address])
    FROM @temp
    GROUP BY ID, Customer
    

    输出 -

    id          Customer Division Address
    ----------- -------- -------- -------
    1           A        M        X
    2           B        N        Y
    3           C        P        W
    
    ID          Customer Division Address
    ----------- -------- -------- -------
    1           A        M        X
    2           B        N        Z
    3           C        T        W
    

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多