sql >> Databáze >  >> NoSQL >> MongoDB

3 způsoby, jak vybrat řádek s maximální hodnotou v SQL

Zde jsou tři příklady, které používají SQL k nalezení a výběru řádku s maximální hodnotou v daném sloupci.

Příklady fungují ve většině hlavních RDBMS, včetně MySQL, MariaDB, PostgreSQL, SQLite, Oracle a SQL Server.

Ukázková data

Začneme s následujícími údaji:

SELECT * FROM PetShow;

Výsledek:

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

Možnost 1

Zde je příklad výběru řádku s maximální hodnotou z Score ve výše uvedené tabulce:

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

Výsledek:

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

Použili jsme MAX() funkce v rámci dílčího dotazu k nalezení maximální hodnoty a vrátila celý řádek s vnějším dotazem.

Když existuje více řádků s maximální hodnotou

Při použití této metody, pokud existuje více než jeden řádek s maximální hodnotou, jsou vráceny všechny.

Předpokládejme, že do tabulky vložíme další řádek se stejným skóre jako stávající maximální skóre:

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

Naše tabulka nyní vypadá takto:

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

Můžeme vidět, že Wag i Purr mají nejvyšší skóre 85.

Spusťte znovu předchozí dotaz a vrátíme maximální hodnotu z tohoto sloupce:

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

Výsledek:

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

Oba řádky s maximálními hodnotami jsou vráceny podle očekávání.

V případě potřeby můžeme sadu výsledků omezit pouze na jeden řádek. Přesný kód bude záviset na používaném RDBMS.

LIMIT klauzuli lze použít s RDBS, jako je PostgreSQL, MariaDB, MySQL a SQLite:

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

Výsledek:

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

V SQL Serveru můžeme použít TOP klauzule:

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

Výsledek:

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

A v databázi Oracle:

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

Výsledek:

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

Možnost 2

Pokud chceme vrátit pouze jeden řádek, můžeme se ve skutečnosti zbavit většiny ostatních kódů a získat pouze první řádek z uspořádaných výsledků:

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

Výsledek:

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

V SQL Server:

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

Výsledek:

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

A v databázi Oracle:

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

Výsledek:

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

Možnost 3

Dalším způsobem, jak vybrat řádek s maximální hodnotou, je připojit tabulku k sobě, takto:

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

Výsledek:

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

Stejně jako v předchozím příkladu můžeme v případě potřeby omezit výsledky na jeden řádek (nebo jiné číslo).


  1. Použití .sort s PyMongem

  2. nemůže zabít redis-server na linuxu

  3. Následovníci - návrh databáze mongodb

  4. 3 způsoby, jak odebrat hodnotu z pole v MongoDB