如何从组中返回多行的一行

时间:2013-08-13 12:00:46

标签: sql sql-server group-by

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

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

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”,但我不知道如何从中获取一行。

我希望有人可以帮助我!

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

试试这个 -

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