2012-02-15 16 views
6

Mam tabeli o nazwie customer_age że LOKS tak:SQL SELECT z wielu rekordów tylko najnowszą

ID  1 2 3  4  5 6  7  8  9 

NAME JIM JIM JIM NICK NICK NICK Paul Paul Paul          
VALUE 20 13 12 10 20 8  4  24 14 

i chcę, aby wyświetlić tylko pierwszy rekord z każdej nazwy. Coś w tym stylu:

ID  1  4  7  

NAME JIM NICK Paul         
VALUE 20 10  4  

Do tej pory nie byłem w stanie tego rozwiązać. Używam serwera sql 2005 Każda pomoc byłaby doceniana ...

+7

Zakładam, że "pierwszy rekord" oznacza ten z najniższym identyfikatorem? –

Odpowiedz

13

Spróbuj użyć podselekcji aby znaleźć najniższą identyfikator dla każdej nazwy, a korzystać z tego zestawu identyfikatorów wyciągnąć rekordy od głównej tabeli:

SELECT ID, Name, Value 
FROM customer_age 
WHERE ID IN 
(
    SELECT MIN(ID) AS ID 
    FROM customer_age 
    GROUP BY Name 
) 
1

Zakładając, że pierwszy rekord oznacza najwyższy identyfikator, możesz wypróbować zapytanie w porządku malejącym według ID i TOP n.

1

Wystarczy wybrać pierwszy rekord dla każdej nazwy, używając cross apply:

SELECT 
ca.ID, ca.NAME, ca.VALUE 
FROM customer_age c 
CROSS APPLY (SELECT TOP 1 ID, NAME, VALUE 
     FROM customer_age ca 
     WHERE ca.NAME = c.NAME ORDER BY ID) ca 
ORDER BY ca.ID 
+0

Daje to powtarzające się wyniki, 3 wiersze w połączeniu customer_age z 1 wierszem zwróconym przez aplikację. – Umair

2

Co powiesz na temat używania funkcji okna?

SELECT Id, Name, Value 
FROM (
    SELECT Id, Name, Value, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Id ASC) AS rowNum 
    FROM customer_age 
) AS sub 
WHERE rowNum = 1