Mam tabelę danych (db to MSSQL):
ID OrderNO PartCode Quantity DateEntered
417 2144 44917 100 18-08-11
418 7235 11762 5 18-08-11
419 9999 60657 100 18-08-11
420 9999 60657 90 19-08-11
Chciałbym zadać zapytanie, które zwraca OrderNO, PartCode i Quantity, ale tylko dla ostatniego zarejestrowanego zamówienia.
Z tabeli przykładowej chciałbym odzyskać następujące informacje:
OrderNO PartCode Quantity
2144 44917 100
7235 11762 5
9999 60657 90
Zwróć uwagę, że tylko jeden wiersz został zwrócony dla zamówienia 9999.
Dzięki!
sql-server
GEMI
źródło
źródło
MAX(DATE)
zwraca ani jednej linii dla zamówienia 9999?Odpowiedzi:
Jeśli
rownumber() over(...)
jest dostępny dla Ciebie ....źródło
Najlepszym sposobem jest Mikael Eriksson, jeśli
ROW_NUMBER()
jest dostępny.Następną najlepszą rzeczą jest przyłączenie się do zapytania, zgodnie z odpowiedzią Cularis.
Alternatywnie, najprostszym i najprostszym sposobem jest skorelowane pod-zapytanie w klauzuli WHERE.
Lub...
źródło
Jest to najszybsze ze wszystkich zapytań podanych powyżej. Koszt zapytania wyniósł 0,0070668.
Preferowana odpowiedź powyżej, autorstwa Mikaela Erikssona, ma koszt zapytania wynoszący 0,0146625
Możesz nie przejmować się wydajnością dla tak małej próbki, ale w dużych zapytaniach wszystko się sumuje.
źródło
Zapytanie wewnętrzne wybiera wszystkie
OrderNo
z ich maksymalną datą. Aby uzyskać inne kolumny tabeli, możesz dołączyć do nichOrderNo
iMaxDate
.źródło
W przypadku MySql możesz wykonać następujące czynności:
źródło
{ }
) na pasku narzędzi edytora, aby ładnie format i składnia go podświetlić!Możesz również użyć tej instrukcji select jako zapytania z lewym złączeniem ... Przykład:
Mam nadzieję, że pomoże to komuś, kto tego szuka :)
źródło
rownumber () over (...) działa, ale nie podobało mi się to rozwiązanie z 2 powodów. - Ta funkcja nie jest dostępna, gdy używasz starszej wersji SQL, takiej jak SQL2000 - Zależność od funkcji i nie jest tak naprawdę czytelna.
Innym rozwiązaniem jest:
źródło
Jeśli masz indeksowany identyfikator i OrderNo, możesz użyć IN: (nienawidzę prostoty handlu ze względu na niejasność, tylko po to, aby zapisać kilka cykli):
źródło
Staraj się unikać IN używać JOIN
źródło
To zadziałało dla mnie doskonale.
źródło
To działa dla mnie. użyj MAX (CONVERT (data, ReportDate)), aby upewnić się, że masz wartość daty
źródło