none
"Nur" die letzten Werte einer Gruppe ausgeben RRS feed

  • Frage

  • Hallo,

    ich habe eine SQL-Tabelle mit Daten befüllt und suche nun eine Möglichkeit, wie ich mir die Tabelle sortieren lassen kann und gleichzeitig nur den letzten Wert ausgeben kann.

    Hier ein Beispiel: Ich brauche z.B. nur die Auswertung der gelb markierten Felder.

    

    hat jemand einen kurzen Tipp für mich, wie ich die auf SQL-Darstellen kann? In Access heißt diese Funktion "Letzter Wert" nur ich brauche in diesem Fall die Abfrage direkt auf dem Server.

    Montag, 13. November 2017 09:12

Antworten

  • Probier mal das hier aus:

    With Maximalwerte as
    (Select  Zimmer, XYZ, DatumZeit, Name, ROW_NUMBER() OVER(PARTITION BY Zimmer, ORDER BY DatumZeit desc) as rn
    from MeineTabelle)
    Select *
    from Maximalwerte
    where rn = 1;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 15. November 2017 11:37
  • Das ist nicht unbedingt ausreichend.
    Die MAX-Funktion liefert nur den größten Wert einer Gruppe, aber nicht den Letzten.

    Funktionieren kann das nur, wenn man eine eindeutige ID hat, die einen letzten Satz identifiziert.
    Dies geht häufig, wenn man Identity-Spalten hat, deren Werte auch grundsätzlich aufsteigend vergeben werden, dann muss obiger SQL ergänzt werden:

    select y.* from (
    select Key1, Key2, ..., Max(MyIdentity) as MyIdentity
    from MyTable
    Group by Key1, key2, ...
    ) x
    inner join MyTable y on x.MyIdentity=y.MyIdentity

    Statt MyIdentity können durchaus auch andere Felder wie Datum/Zeit, Auftragsnummer o.ä. verwendet werden. Sobald allerdings mehrere Felder den letzten Satz identifizieren, muss in MAX(xxx) ein Ausdruck mit Concat der betroffenen Felder verwendet werden.

    Montag, 13. November 2017 10:17

Alle Antworten

  • Hallo,

    das macht man mit einer Gruppierung über Feld01 und Feld02 und der MAX Funktion:

    SELECT

    feld01,feld02,max(feld03)ASMax_Feld03 FROMdbo.Table_Auswertung GROUPBYfeld01,feld02;

    Montag, 13. November 2017 10:06
  • Das ist nicht unbedingt ausreichend.
    Die MAX-Funktion liefert nur den größten Wert einer Gruppe, aber nicht den Letzten.

    Funktionieren kann das nur, wenn man eine eindeutige ID hat, die einen letzten Satz identifiziert.
    Dies geht häufig, wenn man Identity-Spalten hat, deren Werte auch grundsätzlich aufsteigend vergeben werden, dann muss obiger SQL ergänzt werden:

    select y.* from (
    select Key1, Key2, ..., Max(MyIdentity) as MyIdentity
    from MyTable
    Group by Key1, key2, ...
    ) x
    inner join MyTable y on x.MyIdentity=y.MyIdentity

    Statt MyIdentity können durchaus auch andere Felder wie Datum/Zeit, Auftragsnummer o.ä. verwendet werden. Sobald allerdings mehrere Felder den letzten Satz identifizieren, muss in MAX(xxx) ein Ausdruck mit Concat der betroffenen Felder verwendet werden.

    Montag, 13. November 2017 10:17
  • Hallo S. Brand,

    Baldur hat die Lösung bereits beschrieben. Welches Attribut in Deiner Tabelle kennzeichnet denn den "letztes" Datensatz?

    • Ein Datumsstempel?
    • Eine eindeutige ID (z. B. IDENTITY)?

    Aus Deinen Beispieldaten ist nicht eindeutig erkennbar, wie der "letzte" Datensatz ermittelt werden soll.

    Sollten keine eindeutigen Kennzeichen vorhanden sein, wird es eher schwierig! Du könntest mit ROW_NUMBER() den letzten Eintrag ermitteln. Aber auch hier benötigst Du ein Sortierkriterium, dass die Daten nach einer Reihenfolge bestimmt. Bitte beachte aber, dass diese Funktion immer ein ORDER BY benötigt!


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    Montag, 13. November 2017 11:44
  • Hallo,

    zunächst Danke für die Rückmeldung.

    Als Indexfeld kann ich die Uhrzeit herannehmen:

    Zimmer KartenID Uhrzeit Inhaber
    Wohnzimmer 59057 2017-03-01 12:29:11.000 Max Mustermann
    Wohnzimmer 59057 2017-03-01 12:29:17.000 Max Mustermann
    Wohnzimmer 59060 2017-03-01 12:29:29.000 Karl Holzmann
    Wohnzimmer 59057 2017-03-01 12:31:28.000 Max Mustermann
    Schlafzimmer 59057 2017-08-14 13:25:08.000 Max Mustermann
    Schlafzimmer 59060 2017-08-14 13:25:19.000 Karl Holzmann
    Schlafzimmer 59057 2017-08-14 13:25:33.000 Max Mustermann
    Schlafzimmer 59057 2017-08-14 13:25:39.000 Max Mustermann
    Wohnzimmer 59057 2017-03-01 13:36:52.000 Max Mustermann
    Schlafzimmer 59057 2017-11-02 12:36:21.000 Max Mustermann

    Aber irgendwie komme ich noch nicht ganz klar. Könnte ich vielleicht ein Musterscript haben, denn wenn ich es an meinem Beispiel sehe, komme ich besser klar.

    Danke


    Dienstag, 14. November 2017 15:58
  • So, also angenommen die Spalten heißen nun
    Zimmer, XYZ, DatumZeit, Name

    Somit ist DatumZeit deine letzte gültige Information je Zimmer.

    Select Zimmer, max(DatumZeit) as DatumZeit
    From MyTable
    Group by Zimmer

    erhältst du das letzte Datum zu jedem Zimmer.
    Mit diesem Zwischenergebnis greifst du nun wieder auf die selbe Tabelle zu und verknüpfst dabei über Zimmer und DatumZeit:

    select Z.* from (

    Select Zimmer, max(DatumZeit) as DatumZeit
    From MyTable
    Group by Zimmer

    ) M

    inner join MyTable Z on M.Zimmer = Z.Zimmer and M.DatumZeit = Z.DatumZeit

    Den Select in Klammern nennt man "Derived Table", also abgeleitete Tabelle oder einfacher Zwischenergebnis (wobei die Tabelle real nicht exsitiert).
    Über die Auswahl "Z.*" bekommst du nur die Felder der Verknüpfung, da die Zwischenergebnisse nicht interessieren, da sie ja in der Verknüpfung enthalten sind.


    Dienstag, 14. November 2017 18:27
  • Probier mal das hier aus:

    With Maximalwerte as
    (Select  Zimmer, XYZ, DatumZeit, Name, ROW_NUMBER() OVER(PARTITION BY Zimmer, ORDER BY DatumZeit desc) as rn
    from MeineTabelle)
    Select *
    from Maximalwerte
    where rn = 1;


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Mittwoch, 15. November 2017 11:37
  • Hallo,

    zunächst Danke für die Rückmeldung und sorry für die späte Antwort von mir.

    Ohje ist das aber komplex - ist doch in Access soooo einfach :).

    Ich habe es nun abgeschrieben und es schein zu funktionieren - jedoch umsetzen könnte ich alleine noch nicht :)

    Gruß

    Dienstag, 2. Januar 2018 11:50
  • Sehr schön erklärt, das hat mir gerade gut geholfen.
    Mittwoch, 18. Januar 2023 16:48