Ето три примера, които използват 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 | +---------+-----------+---------+
Както в предишния пример, можем да ограничим резултатите до един ред (или друго число), ако е необходимо.