MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

3 Möglichkeiten, die Zeile mit dem Maximalwert in SQL auszuwählen

Hier sind drei Beispiele, die SQL verwenden, um die Zeile mit dem Höchstwert in einer bestimmten Spalte zu finden und auszuwählen.

Die Beispiele funktionieren in den meisten wichtigen RDBMSs, einschließlich MySQL, MariaDB, PostgreSQL, SQLite, Oracle und SQL Server.

Beispieldaten

Wir beginnen mit den folgenden Daten:

SELECT * FROM PetShow;

Ergebnis:

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

Option 1

Hier ist ein Beispiel für die Auswahl der Zeile mit dem Höchstwert aus dem Score Spalte in der obigen Tabelle:

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

Ergebnis:

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

Wir haben den MAX() verwendet Funktion innerhalb einer Unterabfrage, um den Maximalwert zu finden, und die gesamte Zeile mit der äußeren Abfrage zurückgegeben.

Wenn es mehrere Zeilen mit dem maximalen Wert gibt

Wenn es bei dieser Methode mehr als eine Zeile mit dem Maximalwert gibt, werden alle zurückgegeben.

Angenommen, wir fügen eine weitere Zeile mit derselben Punktzahl wie die vorhandene maximale Punktzahl in unsere Tabelle ein:

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

Unsere Tabelle sieht jetzt so aus:

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

Wir können sehen, dass sowohl Wag als auch Purr die höchste Punktzahl von 85 haben.

Lassen Sie uns die vorherige Abfrage erneut ausführen, um den Maximalwert aus dieser Spalte zurückzugeben:

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

Ergebnis:

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

Beide Zeilen mit den Maximalwerten werden wie erwartet zurückgegeben.

Wir können die Ergebnismenge bei Bedarf auf nur eine Zeile beschränken. Der genaue Code hängt vom verwendeten RDBMS ab.

Das LIMIT -Klausel kann mit RDBSs wie PostgreSQL, MariaDB, MySQL und SQLite verwendet werden:

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

Ergebnis:

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

In SQL Server können wir den TOP verwenden Klausel:

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

Ergebnis:

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

Und in der Oracle-Datenbank:

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

Ergebnis:

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

Option 2

Wenn wir wollen, dass nur eine Zeile zurückgegeben wird, können wir tatsächlich auf den größten Teil des anderen Codes verzichten und nur die erste Zeile aus den geordneten Ergebnissen erhalten:

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

Ergebnis:

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

Im SQL-Server:

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

Ergebnis:

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

Und in der Oracle-Datenbank:

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

Ergebnis:

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

Option 3

Eine andere Möglichkeit, die Zeile mit dem Höchstwert auszuwählen, besteht darin, die Tabelle wie folgt mit sich selbst zu verknüpfen:

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

Ergebnis:

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

Wie im vorherigen Beispiel können wir die Ergebnisse bei Bedarf auf eine Zeile (oder eine andere Zahl) beschränken.