Basti: Sql Abfrage und min()

Hallo,

Tabelle:
s1,s2,s3,Datum

ich will einer Abfrage

SELECT
s1,
s2,
s3 FROM ...

zusätzlich das min(Datum) der Ergebnissmenge entlocken.

Wie mache ich das?

Schönes WE, Basian

  1. 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
    1. Hallo Rolf,

      danke für die Erklärung, auch wenn ich die nicht komplett verstanden habe.
      Ich habe es jetzt über 2 getrennte Abfragen gestaltet.
      Funktioniert.
      Den JOIN über eine einzige Query habe ich nicht geschafft.
      Schönes Wochenende
      Bastian

      1. Hallo Bastian,

        wonach gruppierst Du denn?

        Rolf

        --
        sumpsi - posui - obstruxi
    2. Hi,

      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.

      Wobei das zumindest bei MySQL konfigurierbar geworden ist. siehe ONLY_FULL_GROUP_BY - und das ist jetzt sogar per default eingeschaltet.

      cu,
      Andreas a/k/a MudGuard