2009-11-09 7 views
7

wszystkimdostępu: znaleźć wiersz z ostatnim dniem dla każdego odrębnego wpisu w tabeli

Jestem pewien, że jest to całkiem proste pytanie zapytań SQL, ale jestem pewien, że to dobry sposób i bardzo ZŁY sposób, aby to zrobić. Pozostawiony moim własnym urządzeniom, mogę skończyć z tym ostatnim. Więc ...

Mam tabelę w dostępie do danych, który wygląda tak:

ID  Value As_of 
1173 156 20090601 
1173 173 20081201 
1173 307 20080901 
1173 305 20080601 
127  209 20090301 
127  103 20081201 
127  113 20080901 
127  113 20080601 
1271 166 20090201 
1271 172 20081201 
1271 170 20080901 
1271 180 20080601 
... 

Co chciałbym dostać jest „wartość” dla każdego unikalnego identyfikatora z najnowszego „Jak "Data (w formacie RRRRMM).

Więc mój zestaw wynik powinien wyglądać następująco:

ID  Value As_of 
1173 156  20090601 
127  209  20090301 
1271 166  20090201 

Należy pamiętać, że różne identyfikatory mają różne „ile” terminach. Innymi słowy, nie mogę po prostu zidentyfikować najnowszego jako globalnego, a następnie wybrać każdy wiersz z tą datą.

Co warte swojej uwagi, ta tabela ma około 200 000 wierszy całkowitych i około 10 000 unikalnych identyfikatorów.

Wielkie dzięki z góry!

Odpowiedz

8

Jeśli potrzebują zarówno datę i wartość, trzeba zrobić sprzężenie:

SELECT ID, Value,As_of 
from yourTable a inner join 
      (SELECT ID, MAX(As_of) as As_of 
      from yourTable group by ID) b 
on a.ID=b.ID and a.As_of = b.As_of 
+0

Radu - Chciałem ci podziękować za tę odpowiedź - działa idealnie i około 99,99% szybciej niż oryginalny zagnieżdżony "Wybierz Max" próbowałem. Pozdrawiam, Matt – mattstuehler

+0

Świetna robota ... :) –

0

Nie wiesz, co platforma szukasz, aby to zrobić, ale w T-SQL można wykonać następujące czynności:

SELECT t.* 
FROM (
    SELECT ID, MAX(As_Of) as r1 
    FROM myTable 
    GROUP BY ID 
    ) as dt 
INNER JOIN myTable t ON dt.ID = t.ID and dt.r1 = t.As_Of 

powodzenia!

EDYCJA: Cóż, moja biedna odpowiedź przeszkadzała mi, więc naprawiłem ją, mimo że ta odpowiedź już istnieje w innym miejscu na stronie.

+0

Przepraszam, widzę, że powiedziałeś, że Access to db. To powinno ci jeszcze pomóc, mam nadzieję! – Funka

+0

Sądzę, że chciałeś pogrupować według wartości i identyfikatora, ponieważ prosi o wartość przez identyfikator dla maksymalnej daty. –

+0

-1 To nawet nie wskazuje na ID, więc nie spełni potrzeby. Mogłoby być zagnieżdżone w innym zapytaniu i pracować dobrze ... – Smandoli

0

myślę co szukasz to:

select id, wartość, as_of z table_name gdzie as_of = max (as_of) grupa przez id

To mówi za każdym identyfikatorem, znaleźć max as_of, i uzyskaj tę wartość.

To jest ogólny tekst sql. Nie jestem pewien dostępu. Jestem pewien, że jeśli to nie zadziała, jest coś podobnego.

Powodzenia! Joe

4

@Funka, że ​​nie będzie działać, jeśli masz zduplikowane wartości „wartość” dla różnych identyfikatorów - która w zasadzie dają ci listę pogrupowanych według „wartości”, a nie przez id ...

@Joe Sprawiedliwe, agregaty nie są dozwolone w klauzulach bez podkwerendy/posiadających combo, przynajmniej nie w ANSI ...

To daje listę, ale da duplikatów, a także, jeśli masz wiele wierszy z tym samym identyfikatorem/As_of wartości:

select t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 

Jeśli chcesz usunąć duplikaty z tym, że tylko ty aby dodać odrębną na górę wybierz coś takiego:

select distinct t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 
+0

cóż, obie są prawdziwe! ale gdzie jest wyraźny? :-) – Radu094

+0

Przepraszam, właśnie edytowałem, aby dodać go do dolnej kwerendy ... skopiuj/wklej ponownie ... – chadhoc

+0

Chadhoc - Chciałbym ci podziękować za tę odpowiedź - działa idealnie. Przyznałbym ci "zaakceptowaną odpowiedź", z wyjątkiem tego, że podałem to już postowi Radu. Nie jestem pewien, co to jest za protokół - obie odpowiedzi były równie przydatne i poprawne. I kłopoty zostały złożone w tym samym czasie. – mattstuehler

1

Spróbuj czegoś takiego

SELECT t1.* 
FROM (SELECT Table1.ID, Max(Table1.As_Of) AS MaxOfAs_Of 
FROM Table1 
GROUP BY Table1.ID 
) AS MaxIDS INNER JOIN Table1 t1 ON MaxIDS.ID = t1.ID 
and MaxIDS.MaxOfAs_Of = t1.As_Of 
Powiązane problemy