sql >> Database >  >> NoSQL >> MongoDB

3 manieren om de rij met de maximale waarde in SQL te selecteren

Hier zijn drie voorbeelden die SQL gebruiken om de rij met de maximale waarde in een bepaalde kolom te zoeken en te selecteren.

De voorbeelden werken in de meeste grote RDBMS'en, waaronder MySQL, MariaDB, PostgreSQL, SQLite, Oracle en SQL Server.

Voorbeeldgegevens

We beginnen met de volgende gegevens:

SELECT * FROM PetShow;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 2       | Scratch   | 3       |
| 3       | Tweet     | 65      |
| 4       | Bark      | 8       |
| 5       | Ruff      | 15      |
| 6       | Woof      | 20      |
| 7       | Punch     | 3       |
+---------+-----------+---------+

Optie 1

Hier is een voorbeeld van het selecteren van de rij met de maximale waarde uit de Score kolom in de bovenstaande tabel:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow );

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
+---------+-----------+---------+

We gebruikten de MAX() functie binnen een subquery om de maximale waarde te vinden, en retourneerde de hele rij met de buitenste query.

Als er meerdere rijen zijn met de maximale waarde

Als er met deze methode meer dan één rij is met de maximale waarde, worden ze allemaal geretourneerd.

Stel dat we een andere rij in onze tabel invoegen met dezelfde score als de bestaande maximale score:

INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;

Onze tabel ziet er nu als volgt uit:

+---------+-----------+---------+
| 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      |
+---------+-----------+---------+

We kunnen zien dat zowel Wag als Purr de hoogste score van 85 hebben.

Laten we de vorige query opnieuw uitvoeren om de maximale waarde uit die kolom te retourneren:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow );

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 8       | Purr      | 85      |
+---------+-----------+---------+

Beide rijen met de maximale waarden worden geretourneerd zoals verwacht.

We kunnen de resultatenset desgewenst beperken tot slechts één rij. De exacte code is afhankelijk van het RDBMS dat wordt gebruikt.

De LIMIT clausule kan worden gebruikt met RDBS'en zoals PostgreSQL, MariaDB, MySQL en SQLite:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
LIMIT 1;

Resultaat:

+-------+---------+-------+
| PetId | PetName | Score |
+-------+---------+-------+
|     1 | Wag     |    85 |
+-------+---------+-------+

In SQL Server kunnen we de TOP . gebruiken clausule:

SELECT TOP 1
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC;

Resultaat:

+-------+---------+-------+
| PetId | PetName | Score |
+-------+---------+-------+
|     1 | Wag     |    85 |
+-------+---------+-------+

En in Oracle Database:

SELECT
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow )
ORDER BY PetId ASC
FETCH FIRST 1 ROW ONLY;

Resultaat:

+-------+---------+-------+
| PetId | PetName | Score |
+-------+---------+-------+
|     1 | Wag     |    85 |
+-------+---------+-------+

Optie 2

Als we slechts één rij willen retourneren, kunnen we de meeste andere code weglaten en gewoon de eerste rij uit de geordende resultaten halen:

SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC
LIMIT 1;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
+---------+-----------+---------+

In SQL Server:

SELECT TOP 1
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
+---------+-----------+---------+

En in Oracle Database:

SELECT
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
+---------+-----------+---------+

Optie 3

Een andere manier om de rij met de maximale waarde te selecteren, is door de tabel op zichzelf te voegen, als volgt:

SELECT 
    p1.PetId, 
    p1.PetName, 
    p1.Score
FROM PetShow p1
LEFT JOIN PetShow p2 ON p1.Score < p2.Score
WHERE p2.PetId IS NULL;

Resultaat:

+---------+-----------+---------+
| PetId   | PetName   | Score   |
|---------+-----------+---------|
| 1       | Wag       | 85      |
| 8       | Purr      | 85      |
+---------+-----------+---------+

Net als bij het eerdere voorbeeld kunnen we de resultaten desgewenst beperken tot één rij (of een ander nummer).


  1. Top MongoDB-bronnen

  2. Maak standaard verbinding met een specifieke database in mongodb

  3. Een eenvoudige tagging-implementatie met MongoDB

  4. Een duidelijke aggregatie van een matrixveld over indexen verkrijgen