MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

3 modi per selezionare la riga con il valore massimo in SQL

Ecco tre esempi che utilizzano SQL per trovare e selezionare la riga con il valore massimo in una determinata colonna.

Gli esempi funzionano nella maggior parte dei principali RDBMS, inclusi MySQL, MariaDB, PostgreSQL, SQLite, Oracle e SQL Server.

Dati campione

Inizieremo con i seguenti dati:

SELECT * FROM PetShow;

Risultato:

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

Opzione 1

Ecco un esempio di selezione della riga con il valore massimo dal Score colonna nella tabella sopra:

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

Risultato:

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

Abbiamo usato il MAX() funzione all'interno di una sottoquery per trovare il valore massimo e ha restituito l'intera riga con la query esterna.

Quando ci sono più righe con il valore massimo

Utilizzando questo metodo, se è presente più di una riga con il valore massimo, vengono restituite tutte.

Supponiamo di inserire un'altra riga nella nostra tabella con lo stesso punteggio del punteggio massimo esistente:

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

La nostra tabella ora si presenta così:

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

Possiamo vedere che sia Wag che Purr hanno ottenuto il punteggio più alto di 85.

Eseguiamo nuovamente la query precedente per restituire il valore massimo da quella colonna:

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

Risultato:

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

Entrambe le righe con i valori massimi vengono restituite come previsto.

Possiamo limitare il set di risultati a una sola riga, se necessario. Il codice esatto dipenderà dall'RDBMS utilizzato.

Il LIMIT può essere utilizzata con RDBS come PostgreSQL, MariaDB, MySQL e SQLite:

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

Risultato:

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

In SQL Server possiamo usare TOP clausola:

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

Risultato:

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

E nel database Oracle:

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

Risultato:

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

Opzione 2

Se vogliamo che venga restituita solo una riga, possiamo effettivamente eliminare la maggior parte dell'altro codice e ottenere semplicemente la prima riga dai risultati ordinati:

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

Risultato:

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

In SQL Server:

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

Risultato:

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

E nel database Oracle:

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

Risultato:

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

Opzione 3

Un altro modo per selezionare la riga con il valore massimo è unire la tabella su se stessa, in questo modo:

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

Risultato:

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

Come nell'esempio precedente, possiamo limitare i risultati a una riga (o a un altro numero), se necessario.