MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

3 sposoby na wybranie wiersza z maksymalną wartością w SQL

Oto trzy przykłady wykorzystujące SQL do znalezienia i wybrania wiersza z maksymalną wartością w danej kolumnie.

Przykłady działają w większości głównych RDBMS, w tym MySQL, MariaDB, PostgreSQL, SQLite, Oracle i SQL Server.

Przykładowe dane

Zaczniemy od następujących danych:

SELECT * FROM PetShow;

Wynik:

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

Opcja 1

Oto przykład wyboru wiersza z maksymalną wartością z Score kolumna w powyższej tabeli:

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

Wynik:

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

Użyliśmy MAX() funkcji w podzapytaniu, aby znaleźć maksymalną wartość, i zwróciła cały wiersz z zapytaniem zewnętrznym.

Gdy istnieje wiele wierszy z maksymalną wartością

Używając tej metody, jeśli istnieje więcej niż jeden wiersz z wartością max, wszystkie zostaną zwrócone.

Załóżmy, że wstawiamy do naszej tabeli kolejny wiersz z takim samym wynikiem jak istniejący maksymalny wynik:

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

Nasz stół wygląda teraz tak:

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

Widzimy, że zarówno Wag, jak i Purr uzyskali najwyższy wynik 85.

Uruchommy ponownie poprzednie zapytanie, aby zwrócić maksymalną wartość z tej kolumny:

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

Wynik:

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

Oba wiersze z maksymalnymi wartościami są zwracane zgodnie z oczekiwaniami.

W razie potrzeby możemy ograniczyć zestaw wyników tylko do jednego wiersza. Dokładny kod będzie zależał od używanego RDBMS.

LIMIT Klauzula może być używana z bazami danych RDBS, takimi jak PostgreSQL, MariaDB, MySQL i SQLite:

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

Wynik:

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

W SQL Server możemy użyć TOP klauzula:

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

Wynik:

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

A w bazie danych Oracle:

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

Wynik:

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

Opcja 2

Jeśli chcemy, aby zwrócono tylko jeden wiersz, możemy faktycznie pozbyć się większości pozostałego kodu i po prostu uzyskać pierwszy wiersz z uporządkowanych wyników:

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

Wynik:

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

W SQL Server:

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

Wynik:

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

A w bazie danych Oracle:

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

Wynik:

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

Opcja 3

Innym sposobem wybrania wiersza z maksymalną wartością jest samo dołączenie do tabeli, w ten sposób:

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

Wynik:

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

Podobnie jak w poprzednim przykładzie, w razie potrzeby możemy ograniczyć wyniki do jednego wiersza (lub innej liczby).


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak uzyskać dzień, miesiąc i rok z daty w SQL?

  2. Konfigurowanie uwierzytelniania MongoDB-CR jako domyślnego w MongoDB 3.x

  3. O ile szybszy jest Redis niż mongoDB?

  4. MongoDB, MapReduce i sortowanie

  5. $ lookup na ObjectId w tablicy