sql >> Databasteknik >  >> NoSQL >> MongoDB

3 sätt att välja raden med det maximala värdet i SQL

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.


  1. Mongoose TypeError:Användaren är inte en konstruktör

  2. Hur man slår samman arrayfält i dokument i Mongo-aggregation

  3. Rita namn på stater på kartan med Node js och D3 i realtid

  4. Mongofält A större än fält B