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.