Här är tre exempel som använder SQL för att hitta och välja raden med det maximala värdet i en given kolumn.
Exemplen fungerar i de flesta större RDBMS, inklusive MySQL, MariaDB, PostgreSQL, SQLite, Oracle och SQL Server.
Exempeldata
Vi börjar med följande data:
SELECT * FROM PetShow;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 2 | Scratch | 3 | | 3 | Tweet | 65 | | 4 | Bark | 8 | | 5 | Ruff | 15 | | 6 | Woof | 20 | | 7 | Punch | 3 | +---------+-----------+---------+
Alternativ 1
Här är ett exempel på hur du väljer raden med det maximala värdet från Score
kolumn i tabellen ovan:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Vi använde MAX()
funktion inom en underfråga för att hitta det maximala värdet och returnerade hela raden med den yttre frågan.
När det finns flera rader med maxvärdet
Med den här metoden, om det finns mer än en rad med maxvärdet, returneras alla.
Anta att vi infogar en annan rad i vår tabell med samma poäng som den befintliga maxpoängen:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;
Vår tabell ser nu ut så här:
+---------+-----------+---------+ | 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 | +---------+-----------+---------+
Vi kan se att både Wag och Purr har fått den högsta poängen på 85.
Låt oss köra den föregående frågan igen för att returnera det maximala värdet från den kolumnen:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow );
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Båda raderna med maxvärdena returneras som förväntat.
Vi kan begränsa resultatuppsättningen till bara en rad om det behövs. Den exakta koden beror på det RDBMS som används.
LIMIT
klausul kan användas med RDBS som PostgreSQL, MariaDB, MySQL och SQLite:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
I SQL Server kan vi använda TOP
klausul:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Och i Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;
Resultat:
+-------+---------+-------+ | PetId | PetName | Score | +-------+---------+-------+ | 1 | Wag | 85 | +-------+---------+-------+
Alternativ 2
Om vi bara vill ha en rad returnerad kan vi faktiskt avskaffa det mesta av den andra koden och bara få den första raden av de beställda resultaten:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
LIMIT 1;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
I SQL Server:
SELECT TOP 1
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Och i Oracle Database:
SELECT
PetId,
PetName,
Score
FROM PetShow
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | +---------+-----------+---------+
Alternativ 3
Ett annat sätt att välja raden med det maximala värdet är att sammanfoga tabellen på sig själv, så här:
SELECT
p1.PetId,
p1.PetName,
p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;
Resultat:
+---------+-----------+---------+ | PetId | PetName | Score | |---------+-----------+---------| | 1 | Wag | 85 | | 8 | Purr | 85 | +---------+-----------+---------+
Som med det tidigare exemplet kan vi begränsa resultaten till en rad (eller något annat nummer) om det behövs.