Ето три примера, които използват SQL за намиране и избиране на реда с максимална стойност в дадена колона.
Примерите работят в повечето основни RDBMS, включително MySQL, MariaDB, PostgreSQL, SQLite, Oracle и SQL Server.
Примерни данни
Ще започнем със следните данни:
SELECT * FROM PetShow; Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Опция 1
Ето пример за избор на ред с максимална стойност от Score колона в горната таблица:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow ); Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Използвахме MAX() функция в рамките на подзаявка, за да намери максималната стойност, и върна целия ред с външната заявка.
Когато има няколко реда с максимална стойност
Използвайки този метод, ако има повече от един ред с максимална стойност, всички те се връщат.
Да предположим, че вмъкваме друг ред в нашата таблица със същия резултат като съществуващия максимален резултат:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow; Нашата таблица сега изглежда така:
+---------+-----------+---------+ | 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 | +---------+-----------+---------+
Виждаме, че и Wag, и Purr са получили най-високата оценка от 85.
Нека изпълним предишната заявка отново, за да върнем максималната стойност от тази колона:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow ); Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
И двата реда с максималните стойности се връщат според очакванията.
Можем да ограничим набора от резултати само до един ред, ако е необходимо. Точният код ще зависи от използваната RDBMS.
LIMIT Клаузата може да се използва с RDBS, като PostgreSQL, MariaDB, MySQL и SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1; Резултат:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
В SQL Server можем да използваме TOP клауза:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC; Резултат:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
И в Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY; Резултат:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Опция 2
Ако искаме да се върне само един ред, всъщност можем да премахнем повечето от другия код и просто да извадим първия ред от подредените резултати:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1; Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
В SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC; Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
И в Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY; Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Опция 3
Друг начин да изберете реда с максимална стойност е да се присъедините към самата таблица, както следва:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL; Резултат:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Както в предишния пример, можем да ограничим резултатите до един ред (или друго число), ако е необходимо.