sql >> Database teknologi >  >> NoSQL >> MongoDB

3 måder at vælge rækken med den maksimale værdi i SQL

Her er tre eksempler, der bruger SQL til at finde og vælge rækken med den maksimale værdi i en given kolonne.

Eksemplerne fungerer i de fleste større RDBMS'er, inklusive MySQL, MariaDB, PostgreSQL, SQLite, Oracle og SQL Server.

Eksempeldata

Vi starter med følgende data:

SELECT * FROM PetShow;

Resultat:

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

Valgmulighed 1

Her er et eksempel på valg af rækken med den maksimale værdi fra Score kolonne i ovenstående tabel:

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

Resultat:

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

Vi brugte MAX() funktion i en underforespørgsel for at finde den maksimale værdi og returnerede hele rækken med den ydre forespørgsel.

Når der er flere rækker med den maksimale værdi

Ved hjælp af denne metode, hvis der er mere end én række med maks. værdi, returneres alle.

Antag, at vi indsætter en anden række i vores tabel med samme score som den eksisterende max score:

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

Vores tabel ser nu sådan ud:

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

Vi kan se, at både Wag og Purr har fået den højeste score på 85.

Lad os køre den forrige forespørgsel igen for at returnere den maksimale værdi fra den kolonne:

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

Resultat:

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

Begge rækker med de maksimale værdier returneres som forventet.

Vi kan begrænse resultatsættet til kun én række, hvis det kræves. Den nøjagtige kode vil afhænge af det RDBMS, der bruges.

LIMIT klausul kan bruges med RDBS'er såsom PostgreSQL, MariaDB, MySQL og SQLite:

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

Resultat:

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

I SQL Server kan vi bruge TOP klausul:

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

Resultat:

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

Og i Oracle Database:

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

Resultat:

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

Valgmulighed 2

Hvis vi kun vil have én række returneret, kan vi faktisk fjerne det meste af den anden kode og bare få den første række ud af de bestilte resultater:

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

Resultat:

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

I SQL Server:

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

Resultat:

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

Og i Oracle Database:

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

Resultat:

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

Valgmulighed 3

En anden måde at vælge rækken med den maksimale værdi på er at slutte sig til tabellen på sig selv, sådan her:

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

Resultat:

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

Som med det tidligere eksempel kan vi begrænse resultaterne til én række (eller et andet tal), hvis det kræves.


  1. Python og MongoDB databaseudvikling

  2. Indsæt element i indlejrede arrays i MongoDB

  3. Opret et 2dsphere Geospatial Index for sfæriske forespørgsler i MongoDB

  4. Arbejde med specialkarakterer i en Mongo-samling