2009-06-02 13 views
5

Mam kwerendy, które wykonuje szereg złączeń i ma kilka kryteriów w klauzuli WHERE, a ja kończąc z wynikiem, który zasadniczo wygląda następująco:SQL przez grupę problemu

| userId |  date | otherData | 
|--------+------------+------------| 
|  1 | 2008-01-01 | different | 
|  1 | 2009-01-01 |  info | 
|  1 | 2010-01-01 |  for | 
|  2 | 2008-01-01 |  each | 
|  3 | 2008-01-01 |  row | 
|  3 | 2009-01-01 |  here | 

Tak w istocie dla każdego użytkownika będzie jedna lub więcej dat w przeszłości i 0 lub więcej dat w przyszłości.

Muszę jakoś zmniejszyć zbiór danych do jednego wiersza na użytkownika, tylko wybierając wiersz, który ma ostatnio podaną datę. Oznacza to, ze cokolwiek magia GROUP BY lub HAVING klauzula dodaje, wynik z góry będzie wyglądać następująco:

| userId |  date | otherData | 
|--------+------------+------------| 
|  1 | 2009-01-01 |  info | 
|  2 | 2008-01-01 |  each | 
|  3 | 2009-01-01 |  here | 

Odpowiedz

5

Chyba nie chcesz używać GROUP BY/HAVING, ponieważ jesteś zainteresowany dokładnie 1 wiersz na użytkownika, a ten wiersz już istnieje w tabeli bez zmian. To wymaga klauzuli WHERE, a nie GROUP BY/HAVING.

Moja sugestia jest taka, że ​​w klauzuli WHERE dodaje się warunek, że data musi być równa wynikowi podzapytania. Że podzapytanie powinien:

  1. Wybierz max (data)
  2. Mają klauzuli WHERE, która ogranicza datę, aby być mniejsza niż obecnie
  3. Czy WHERE z UserID równa identyfikator użytkownika zewnętrznej kwerendy za

Aby zapobiec przypadkom, w których dany użytkownik może mieć dwa wpisy o tej samej dacie, która jest także maksymalną datą "minionego", należy również dodać DISTINCT.

Nadzieję, że pomaga.

+0

działa dobrze !! ale dodanie DISTINCT nie powoduje usunięcia zduplikowanych wartości, żadnych sugestii? – Rakesh

0

Jak to:

select a.userId, a.date, b.userId, b.otherData 
from table1 as a 
left outer join table2 as b on a.userId = b.userId 
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId) 
0
 
Select 
    userID, date, otherData 
from 
    yourTable t1 
where 
    date = 
    (select max(date) from yourTable t2 
    where t1.userID=t2.userID) 
0
select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT 
where 
    T.userid = GT.userid and T.date = GT.max_date 

Objaśnienie: Wewnętrzna wybierz - izolate tylko zapisy z datą max dla każdego użytkownika. Całe zaznaczenie - dołączaj izolowane rekordy z oryginalną tabelą, aby uzyskać pole otherdata.

Założono, że istnieje tylko jedna maksymalna data dla identyfikatora użytkownika. Proszę powiedzieć, czy jest to prawidłowe założenie.

Powiązane problemy