Heim >Datenbank >MySQL-Tutorial >Wie kann ich Zeilen mit dem Maximalwert pro Gruppe in einer relationalen Datenbank effizient abrufen?

Wie kann ich Zeilen mit dem Maximalwert pro Gruppe in einer relationalen Datenbank effizient abrufen?

Susan Sarandon
Susan SarandonOriginal
2025-01-21 08:03:10899Durchsuche

How Can I Efficiently Retrieve Rows with the Maximum Value per Group in a Relational Database?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn