Effizientes Finden von Maximalwerten innerhalb von Gruppen in relationalen Datenbanken
Das Extrahieren von Zeilen mit den Maximalwerten für bestimmte Spalten unter Beibehaltung der Gruppenintegrität innerhalb relationaler Datenbanken kann komplex sein. In diesem Artikel geht es um die Herausforderung, die Zeile mit der höchsten runden Zahl für jede eindeutige ID abzurufen und dabei die Abfrageeffizienz zu priorisieren.
Eine Methode verwendet Unterabfragen:
<code class="language-sql">SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null;</code>
Dieser Ansatz ist jedoch aufgrund des Filterschritts nach der Verarbeitung ineffizient.
Für eine verbesserte Leistung sollten Sie die Verwendung von Fensterfunktionen in Betracht ziehen:
<code class="language-sql">SELECT DISTINCT id ,max(round) OVER (PARTITION BY id) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;</code>
Diese Abfrage verwendet Fensterfunktionen, um die maximale Runde für jede ID zu bestimmen und ruft dann die entsprechende Punktzahl ab. Das Schlüsselwort DISTINCT
stellt eine einzelne Zeile pro ID sicher.
Eine potenziell schnellere Alternative, bei der dieselbe Fensterfunktion zweimal verwendet wird:
<code class="language-sql">SELECT DISTINCT id ,first_value(round) OVER (PARTITION BY id ORDER BY round DESC) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;</code>
Beide optimierten Lösungen vermeiden unnötige Filterung, was im Vergleich zum Unterabfrage-Ansatz zu schnelleren Abfrageausführungszeiten führt.
Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen mit dem Maximalwert pro Gruppe in einer relationalen Datenbank effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!