Benutzer mit den meisten Antworten
"Nur" die letzten Werte einer Gruppe ausgeben

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.
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 20. November 2017 07:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 30. November 2017 14:35
-
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.MyIdentityStatt 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.
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 20. November 2017 07:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 30. November 2017 14:35
Alle Antworten
-
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.MyIdentityStatt 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.
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 20. November 2017 07:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 30. November 2017 14:35
-
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) -
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
-
So, also angenommen die Spalten heißen nun
Zimmer, XYZ, DatumZeit, NameSomit ist DatumZeit deine letzte gültige Information je Zimmer.
Select Zimmer, max(DatumZeit) as DatumZeit
From MyTable
Group by Zimmererhä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.- Bearbeitet Der Suchende Dienstag, 14. November 2017 18:28
-
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Montag, 20. November 2017 07:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 30. November 2017 14:35
-
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ß