MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

3 maneiras de selecionar a linha com o valor máximo no SQL


Aqui estão três exemplos que usam SQL para localizar e selecionar a linha com o valor máximo em uma determinada coluna.

Os exemplos funcionam na maioria dos principais RDBMSs, incluindo MySQL, MariaDB, PostgreSQL, SQLite, Oracle e SQL Server.

Dados de amostra


Começaremos com os seguintes dados:
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       |
+---------+-----------+---------+

Opção 1


Aqui está um exemplo de como selecionar a linha com o valor máximo da Score coluna da tabela acima:
SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow );

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

Usamos o MAX() função dentro de uma subconsulta para encontrar o valor máximo e retornou a linha inteira com a consulta externa.

Quando há várias linhas com o valor máximo


Usando este método, se houver mais de uma linha com o valor máximo, todas elas serão retornadas.

Suponha que inserimos outra linha em nossa tabela com a mesma pontuação que a pontuação máxima existente:
INSERT INTO PetShow VALUES (8, 'Purr', 85);
SELECT * FROM PetShow;

Nossa tabela agora está assim:
+---------+-----------+---------+
| 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 Wag e Purr obtiveram a pontuação mais alta de 85.

Vamos executar a consulta anterior novamente para retornar o valor máximo dessa coluna:
SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
WHERE Score = ( SELECT MAX(Score) FROM PetShow );

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

Ambas as linhas com os valores máximos são retornadas conforme o esperado.

Podemos limitar o conjunto de resultados a apenas uma linha, se necessário. O código exato dependerá do RDBMS que está sendo usado.

O LIMIT cláusula pode ser usada com RDBSs como PostgreSQL, MariaDB, MySQL e 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 |
+-------+---------+-------+

No SQL Server, podemos usar o 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 |
+-------+---------+-------+

E no banco de dados 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 |
+-------+---------+-------+

Opção 2


Se quisermos apenas uma linha retornada, podemos eliminar a maior parte do outro código e apenas obter a primeira linha dos resultados ordenados:
SELECT 
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC
LIMIT 1;

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

No SQL Server:
SELECT TOP 1
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC;

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

E no banco de dados Oracle:
SELECT
    PetId,
    PetName,
    Score
FROM PetShow 
ORDER BY Score DESC
FETCH FIRST 1 ROW ONLY;

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

Opção 3


Outra forma de selecionar a linha com o valor máximo é juntar a tabela em si mesma, assim:
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      |
+---------+-----------+---------+

Assim como no exemplo anterior, podemos limitar os resultados a uma linha (ou algum outro número), se necessário.