5

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

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

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

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

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

我正在使用 SQL Server 2008。我想我需要在最后两列中做一个“GROUP BY”,但我不知道如何从中取出一行。

我希望有一个人可以帮助我!

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

4

2 回答 2

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
于 2013-08-13T12:05:36.393 回答
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
于 2013-08-13T12:05:31.583 回答