我正在尝试从数据库中提取一个独特客户列表,其中一些客户不止一次列出。 (几乎)重复的行存在是因为客户已从一个部门转移到另一个部门,或者因为客户已在另一个地址(或两者)注册。
所以我的挑战是数据看起来像这样:
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”,但我不知道如何从中获取一行。
我希望有人可以帮助我!
(是的,我知道问题应该在源头解决,但不幸的是,这在任何合理的时间范围内都是不可能的......)。
答案 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