Mam tabelę, która jest pozycją kolekcji dotyczącą tego, kiedy użytkownik był zalogowany.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
Jak utworzyć zapytanie, które dałoby mi najnowszą datę dla każdego użytkownika?
Aktualizacja: Zapomniałem, że muszę mieć wartość zgodną z najnowszą datą.
sql
greatest-n-per-group
głowa ryby
źródło
źródło
Odpowiedzi:
źródło
max(date)
zwróci datę, która połączy wiele rekordów). Aby uniknąć tego problemu, najlepiej byłoby użyć rozwiązania @ dotjoe: stackoverflow.com/a/2411763/4406793 .Korzystanie z funkcji okna (działa w Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
źródło
username
w tym przypadku) i nie wymaga nawet unikalnego pola „uporządkowanego” (takiego jak dołączeniemax(date)
w innych odpowiedziach).order by date desc, id desc)
.Widzę, że większość programistów używa wbudowanego zapytania bez rozważania jego wpływu na ogromne dane.
Po prostu możesz to osiągnąć poprzez:
źródło
Aby uzyskać cały wiersz zawierający maksymalną datę dla użytkownika:
źródło
źródło
Z mojego doświadczenia wynika, że najszybszym sposobem jest pobranie każdego wiersza, dla którego nie ma nowszego wiersza w tabeli.
Kolejną zaletą jest to, że zastosowana składnia jest bardzo prosta i że znaczenie zapytania jest raczej łatwe do uchwycenia (weź wszystkie wiersze, aby nie było nowszego wiersza dla rozważanej nazwy użytkownika).
NIE ISTNIEJE
NUMER WIERSZA
DOŁĄCZ DO WEWNĘTRZNEGO
DOŁĄCZ DO LEWEGO ZEWNĘTRZNEGO
źródło
SELECT username, value FROM t WHERE NOT EXISTS ( SELECT * FROM t AS witness WHERE witness.date > t.date AND witness.username = t.username );
Ten powinien dać ci poprawny wynik dla edytowanego pytania.
Pod-zapytanie upewnia się, że znajdziesz tylko wiersze z najnowszą datą, a zewnętrzna
GROUP BY
zajmie się więzami. Jeśli dla tego samego użytkownika będą dwa wpisy dla tej samej daty, zwróci ten z najwyższymvalue
.źródło
Możesz także użyć analitycznej funkcji rangi
źródło
Rozwiązałoby zaktualizowany problem. Może nie działać tak dobrze na dużych stołach, nawet przy dobrym indeksowaniu.
źródło
źródło
Dla Oracle sortuje zestaw wyników w kolejności malejącej i pobiera pierwszy rekord, aby uzyskać najnowszy rekord:
źródło
źródło
źródło
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
Zapytanie wewnętrzne zwróci ostatnią datę dla bieżącego użytkownika, zapytanie zewnętrzne pobierze wszystkie dane zgodnie z wynikiem zapytania wewnętrznego.
źródło
W ten sposób pobrałem ostatni rekord dla każdego użytkownika, który mam na stole. To było zapytanie o ostatnią lokalizację dla sprzedawcy zgodnie z ostatnim czasem wykrytym na urządzeniach PDA.
źródło
źródło
Moja mała kompilacja
join
lepiej niż zagnieżdżoneselect
group by
nie daje ci tego,primary key
co jest lepszejoin
partition by
w połączeniu zfirst_value
( dokumentami )Oto pytanie:
Plusy:
where
pomocą instrukcji przy użyciu dowolnej kolumnyselect
dowolne kolumny z filtrowanych wierszyCons:
źródło
Zrobiłem trochę dla mojej aplikacji, ponieważ:
Poniżej znajduje się zapytanie:
źródło
Jest to podobne do jednej z powyższych odpowiedzi, ale moim zdaniem jest o wiele prostsze i uporządkowane. Pokazuje również dobre zastosowanie instrukcji cross Apply. Dla SQL Server 2005 i nowszych ...
źródło
źródło
Powinno to również działać, aby uzyskać wszystkie najnowsze wpisy dla użytkowników.
źródło
Użyłbyś funkcji agregującej MAX i GROUP BY
źródło
value
, a nie powiązany zMAX(date)
wierszem.