MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

3 façons de sélectionner la ligne avec la valeur maximale en SQL

Voici trois exemples qui utilisent SQL pour rechercher et sélectionner la ligne avec la valeur maximale dans une colonne donnée.

Les exemples fonctionnent dans la plupart des principaux SGBDR, y compris MySQL, MariaDB, PostgreSQL, SQLite, Oracle et SQL Server.

Exemple de données

Nous allons commencer avec les données suivantes :

SELECT * FROM PetShow;

Résultat :

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

Option 1

Voici un exemple de sélection de la ligne avec la valeur maximale du Score colonne dans le tableau ci-dessus :

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

Résultat :

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

Nous avons utilisé le MAX() fonction dans une sous-requête pour trouver la valeur maximale, et a renvoyé la ligne entière avec la requête externe.

Lorsqu'il y a plusieurs lignes avec la valeur maximale

En utilisant cette méthode, s'il y a plus d'une ligne avec la valeur max, elles sont toutes renvoyées.

Supposons que nous insérions une autre ligne dans notre tableau avec le même score que le score max existant :

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

Notre tableau ressemble maintenant à ceci :

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

Nous pouvons voir que Wag et Purr ont obtenu le score le plus élevé de 85.

Exécutons à nouveau la requête précédente pour renvoyer la valeur maximale de cette colonne :

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

Résultat :

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

Les deux lignes avec les valeurs maximales sont renvoyées comme prévu.

Nous pouvons limiter le jeu de résultats à une seule ligne si nécessaire. Le code exact dépendra du SGBDR utilisé.

La LIMIT La clause peut être utilisée avec des RDBS tels que PostgreSQL, MariaDB, MySQL et SQLite :

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

Résultat :

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

Dans SQL Server, nous pouvons utiliser le TOP clause :

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

Résultat :

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

Et dans la base de données Oracle :

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

Résultat :

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

Option 2

Si nous voulons qu'une seule ligne soit renvoyée, nous pouvons en fait supprimer la plupart des autres codes et n'obtenir que la première ligne des résultats triés :

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

Résultat :

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

Dans SQL Server :

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

Résultat :

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

Et dans la base de données Oracle :

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

Résultat :

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

Option 3

Une autre façon de sélectionner la ligne avec la valeur maximale est de joindre la table sur elle-même, comme ceci :

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

Résultat :

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

Comme dans l'exemple précédent, nous pouvons limiter les résultats à une ligne (ou à un autre nombre) si nécessaire.