Vinzenz Mai: MAX-Wert einer Spalte mit restlichen Daten der Zeile auslesen

Beitrag lesen

Hallo Matthias

Ich würde gerne aus der Tabelle


| a | b | c |

| 2 | x | L |
| 3 | x | D |
| 5 | y | A |
| 2 | y | E |

den jeweils höchsten a-Wert einer jeden Gruppe von b-Datensätzen mit dem dazugehörigen c-Element auslesen. Rauskommen soll also

3,D
5,A.

Ich versuche das mit der Abfrage "SELECT MAX(a), c FROM tabelle GROUP BY b". Die liefert als Ergebnis aber

Ein anständiges Datenbankmanagementsystems meckert bei einer solchen Abfrage. MySQL ist da meiner Ansicht nach zu großzügig.

3,L
5,A.

Es wird also offensichtlich immer der erste in c gefundene Wert und der höchste a-Wert einer jeden Gruppe ausgelesen.

Sagen wir so, es ist nicht vorhersagbar, welcher Wert bei c auftaucht. Du darfst Dich nicht darauf verlassen.

Kann mir jemand sagen, wie ich meine Abfrage ändern muß, um das gewünschte Ergebnis zu erlangen?

Ein vernünftiges DBMS vorausgesetzt, das Views kennt:

  
CREATE VIEW vw_max_werte AS  
    SELECT  
        MAX(a) AS max_a,  
        b  
    FROM tabelle  
    GROUP BY b  
/* natürlich nur einmal ausführen */  
  
SELECT  
    a,  
    c  
FROM tabelle AS t  
INNER JOIN vw_max_werte AS m  
ON t.a = m.max_a AND t.b = m.b  

Mir ist klar, daß ich erst den höchsten Wert der a-Spalte in eine MySQL-Variable auslesen kann,

Aha, Du verwendest MySQL. Das ist keine gute Nachricht.
MySQL unterstützt Views erst in [http://dev.mysql.com/doc/mysql/en/views.html@title=Version 5.0]. Welche Version steht Dir zur Verfügung. Immer angeben!

um dann nach dem dazugehörigen Wert der c-Spalte zu suchen (und das in eine Schleife packen kann), aber da das Problem in einem etwas komplizierteren als hier dargestellten Datengefüge auftritt, würde ich vorab gerne wissen, ob es auch eine Abfrage gibt, die mir direkt das gewünschte Ergebis liefert.

Die oben vorgestellte Lösung funktioniert unter MS SQL-Server hervorragend :-)

Freundliche Grüße

Vinzenz