MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

3 начина да изберете реда с максимална стойност в SQL

Ето три примера, които използват SQL за намиране и избиране на реда с максимална стойност в дадена колона.

Примерите работят в повечето основни RDBMS, включително MySQL, MariaDB, PostgreSQL, SQLite, Oracle и SQL Server.

Примерни данни

Ще започнем със следните данни:

SELECT * FROM PetShow;

Резултат:

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

Опция 1

Ето пример за избор на ред с максимална стойност от Score колона в горната таблица:

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

Резултат:

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

Използвахме MAX() функция в рамките на подзаявка, за да намери максималната стойност, и върна целия ред с външната заявка.

Когато има няколко реда с максимална стойност

Използвайки този метод, ако има повече от един ред с максимална стойност, всички те се връщат.

Да предположим, че вмъкваме друг ред в нашата таблица със същия резултат като съществуващия максимален резултат:

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

Нашата таблица сега изглежда така:

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

Виждаме, че и Wag, и Purr са получили най-високата оценка от 85.

Нека изпълним предишната заявка отново, за да върнем максималната стойност от тази колона:

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

Резултат:

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

И двата реда с максималните стойности се връщат според очакванията.

Можем да ограничим набора от резултати само до един ред, ако е необходимо. Точният код ще зависи от използваната RDBMS.

LIMIT Клаузата може да се използва с RDBS, като PostgreSQL, MariaDB, MySQL и SQLite:

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

Резултат:

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

В SQL Server можем да използваме TOP клауза:

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

Резултат:

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

И в Oracle Database:

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

Резултат:

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

Опция 2

Ако искаме да се върне само един ред, всъщност можем да премахнем повечето от другия код и просто да извадим първия ред от подредените резултати:

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

Резултат:

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

В SQL Server:

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

Резултат:

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

И в Oracle Database:

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

Резултат:

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

Опция 3

Друг начин да изберете реда с максимална стойност е да се присъедините към самата таблица, както следва:

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

Резултат:

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

Както в предишния пример, можем да ограничим резултатите до един ред (или друго число), ако е необходимо.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да актуализирам _id на един MongoDB документ?

  2. Проактивен мониторинг на MongoDB (ъгъл на Developer Studio/Advisors)

  3. Обновяване/поправяне на Mongoose?

  4. Как да актуализирате стойности с помощта на pymongo?

  5. Автоматизирана проверка на конфигурацията на базата данни