sql >> Base de Datos >  >> NoSQL >> MongoDB

3 formas de seleccionar la fila con el valor máximo en SQL

Aquí hay tres ejemplos que usan SQL para buscar y seleccionar la fila con el valor máximo en una columna determinada.

Los ejemplos funcionan en la mayoría de los principales RDBMS, incluidos MySQL, MariaDB, PostgreSQL, SQLite, Oracle y SQL Server.

Datos de muestra

Comenzaremos con los siguientes datos:

SELECT * FROM PetShow;

Resultado:

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

Opción 1

Este es un ejemplo de cómo seleccionar la fila con el valor máximo de la Score columna en la tabla anterior:

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

Resultado:

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

Usamos el MAX() dentro de una subconsulta para encontrar el valor máximo y devolvió la fila completa con la consulta externa.

Cuando hay varias filas con el valor máximo

Con este método, si hay más de una fila con el valor máximo, se devuelven todas.

Supongamos que insertamos otra fila en nuestra tabla con la misma puntuación que la puntuación máxima existente:

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

Nuestra tabla ahora se ve así:

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

Podemos ver que tanto Wag como Purr tienen la puntuación más alta de 85.

Ejecutemos la consulta anterior nuevamente para devolver el valor máximo de esa columna:

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

Resultado:

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

Ambas filas con los valores máximos se devuelven como se esperaba.

Podemos limitar el conjunto de resultados a una sola fila si es necesario. El código exacto dependerá del RDBMS que se utilice.

El LIMIT La cláusula se puede usar con RDBS como PostgreSQL, MariaDB, MySQL y SQLite:

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

Resultado:

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

En SQL Server, podemos usar el TOP cláusula:

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

Resultado:

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

Y en base de datos Oracle:

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

Resultado:

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

Opción 2

Si solo queremos que se devuelva una fila, podemos eliminar la mayor parte del otro código y obtener la primera fila de los resultados ordenados:

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

Resultado:

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

En SQL Server:

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

Resultado:

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

Y en base de datos Oracle:

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

Resultado:

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

Opción 3

Otra forma de seleccionar la fila con el valor máximo es unir la tabla sobre sí misma, así:

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

Resultado:

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

Al igual que con el ejemplo anterior, podemos limitar los resultados a una fila (o algún otro número) si es necesario.