2013-08-13 58 views
5

Tôi đang cố trích xuất danh sách khách hàng duy nhất từ ​​cơ sở dữ liệu nơi một số khách hàng được liệt kê nhiều lần. Các hàng (gần như) trùng lặp tồn tại bởi vì khách hàng đã được chuyển từ bộ phận này sang bộ phận khác hoặc bởi vì khách hàng đã được đăng ký với một địa chỉ khác (hoặc cả hai).Cách trả lại một hàng từ nhóm theo nhiều cột

Vì vậy, thách thức của tôi là trong dữ liệu mà trông giống như sau:

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 

Tôi muốn lựa chọn công bố của tôi để trả lại một hàng cho mỗi khách hàng (Tôi không chăm sóc mà người ta).

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

Tôi đang sử dụng SQL Server 2008. Tôi nghĩ tôi cần phải thực hiện "GROUP BY" hai cột cuối cùng nhưng tôi không biết cách chỉ nhận một hàng trong số đó.

Tôi hy vọng ai đó có thể giúp tôi!

(Có, tôi biết sự cố phải được giải quyết tại nguồn nhưng rất tiếc là không thể thực hiện được trong bất kỳ khung thời gian hợp lý nào ...).

Trả lời

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 
+0

này giải quyết vấn đề của tôi. Cảm ơn bạn rất nhiều, valex! Tôi nghĩ rằng tôi - gần như - hiểu cách nó hoạt động. "T1" làm tôi ngạc nhiên? Cái đó làm cái gì? Nó chỉ là một biến để giữ sub chọn hay? –

+0

@Peter_DK T1 là bí danh cho truy vấn phụ bên trong. – valex

1

Hãy thử điều này một -

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 

Output -

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 
Các vấn đề liên quan