Rolf B: Sql Abfrage und min()

Beitrag lesen

Hallo Basti,

MIN ist eine Aggregatfunktion, d.h. wenn Du AUCH die Spalten s1, s2 und s3 ermittelst, kann sich das Minimum nur darauf beziehen, dass es mehrere Zeilen gibt, die alle den gleichen Wert für s1, s2, s3 haben und in diesen Zeilen wird das kleinste Datum bestimmt.

Um dem SQL Server zu sagen, dass er nach diesen Spalten gruppieren soll, verwendest Du die GROUP BY Klausel.

SELECT s1, s2, s3, MIN(datum)
FROM table
GROUP BY s1, s2, s3

Beachte: Nach der reinen Lehre muss jede Spalte, die im SELECT abgerufen wird, entweder im GROUP BY aufgeführt sein, ODER es muss ein Aggregat (MIN, MAX, SUM, COUNT, AVG) sein. Diese reine Lehre wird von MYSQL und MariaDB aufgeweicht, du kannst auch andere Spalten abrufen, aber dann ist es mehr oder weniger Zufall, aus welcher Zeile der abgerufene Wert stammt.

Das heißt: Wenn die Gruppierung nach s1, s2, s3 für Dich zu detailliert ist und Du bspw. das Minimum aller Datümer über die s1 Gruppen haben willst, musst Du eigentlich 2 Abfragen machen. Oder einen JOIN.

Zur Illustration des Problems der reinen Lehre:

A    B    C
1    1   12
1    2   15
1    3   21
2    2   26
2    1   12
2    5   20
3    2   13
3    3   21
3    7   42
SELECT A, B, SUM(C)
FROM daten
GROUP BY A

Das Ergebnis wäre nicht wirklich bestimmbar. Welcher Wert soll für B ausgewählt werden? MYSQL nimmt den ersten, den es antrifft. Ich finde das fragwürdig und habe deshalb ein ? dazugeschrieben.

A    B   SUM(C)
1    1?    48
2    2?    58
3    2?    76

Rolf

--
sumpsi - posui - obstruxi