Oto trzy przykłady wykorzystujące SQL do znalezienia i wybrania wiersza z maksymalną wartością w danej kolumnie.
Przykłady działają w większości głównych RDBMS, w tym MySQL, MariaDB, PostgreSQL, SQLite, Oracle i SQL Server.
Przykładowe dane
Zaczniemy od następujących danych:
SELECT * FROM PetShow;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Opcja 1
Oto przykład wyboru wiersza z maksymalną wartością z Score
kolumna w powyższej tabeli:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Użyliśmy MAX()
funkcji w podzapytaniu, aby znaleźć maksymalną wartość, i zwróciła cały wiersz z zapytaniem zewnętrznym.
Gdy istnieje wiele wierszy z maksymalną wartością
Używając tej metody, jeśli istnieje więcej niż jeden wiersz z wartością max, wszystkie zostaną zwrócone.
Załóżmy, że wstawiamy do naszej tabeli kolejny wiersz z takim samym wynikiem jak istniejący maksymalny wynik:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Nasz stół wygląda teraz tak:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | | 8 | Purr | 85 | +---------+-----------+---------+
Widzimy, że zarówno Wag, jak i Purr uzyskali najwyższy wynik 85.
Uruchommy ponownie poprzednie zapytanie, aby zwrócić maksymalną wartość z tej kolumny:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Oba wiersze z maksymalnymi wartościami są zwracane zgodnie z oczekiwaniami.
W razie potrzeby możemy ograniczyć zestaw wyników tylko do jednego wiersza. Dokładny kod będzie zależał od używanego RDBMS.
LIMIT
Klauzula może być używana z bazami danych RDBS, takimi jak PostgreSQL, MariaDB, MySQL i SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Wynik:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
W SQL Server możemy użyć TOP
klauzula:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Wynik:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
A w bazie danych Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Wynik:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Opcja 2
Jeśli chcemy, aby zwrócono tylko jeden wiersz, możemy faktycznie pozbyć się większości pozostałego kodu i po prostu uzyskać pierwszy wiersz z uporządkowanych wyników:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
W SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
A w bazie danych Oracle:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Opcja 3
Innym sposobem wybrania wiersza z maksymalną wartością jest samo dołączenie do tabeli, w ten sposób:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Wynik:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Podobnie jak w poprzednim przykładzie, w razie potrzeby możemy ograniczyć wyniki do jednego wiersza (lub innej liczby).