2013-08-13 12 views
5

Próbuję wyodrębnić listę unikalnych klientów z bazy danych, w której niektórzy klienci są wymienieni więcej niż raz. Wiersze (prawie) duplikatów istnieją, ponieważ klienci zostali przeniesieni z jednego działu do drugiego lub dlatego, że klienci zostali zarejestrowani pod innym adresem (lub jednym i drugim).Jak zwrócić jeden wiersz z grupy według wielu kolumn

Więc moim wyzwaniem jest danych, który wygląda mniej więcej tak:

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 

Chcę moje SELECT, aby powrócić jeden wiersz dla każdego klienta (I dont care, który z nich).

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

Używam SQL Server 2008. Myślę, że trzeba zrobić „grupy przez” ostatnie dwie kolumny, ale nie wiem, jak się tylko jeden wiersz z niego.

Mam nadzieję, że ktoś może mi pomóc!

(Tak, wiem, że problem powinien zostać rozwiązany u źródła, ale niestety nie jest to możliwe w rozsądnych ramach czasowych ...).

Odpowiedz

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

to rozwiązać mój problem. Dziękuję bardzo, valex! Myślę, że - prawie - rozumiem, jak to działa. "T1" sprawia, że ​​się zastanawiam? Co to oznacza? Czy jest to po prostu zmienna do trzymania sub-selekcji lub? –

+0

@Peter_DK T1 jest aliasem dla wewnętrznego podzapytania. – valex

1

Spróbuj jeden -

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 

Wyjście -

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