Benutzer mit den meisten Antworten
SQL Statment für letzten Datensatz einer Gruppe gesucht

Frage
-
Hallo an alle,
ich habe eine Tabelle in der für jeden Kunden mehrfach Daten gespeichert sind und ich suche nun ein SQL-Statment, bei dem ich den jeweils letzten Datensatz je Kunde bekomme:
ID KdnNr Kunde Datum Ergebnis
1 1 Kunde 1 10.08.2010 50
2 1 Kunde 1 20.09.2010 57
3 2 Kunde 2 13.08.2010 43
4 1 Kunde 1 05.10.2010 23
Als Ergebnis hätte ich gern:
3 2 Kunde 2 13.08.2010 43
4 1 Kunde 1 05.10.2010 23
Irgendwie stehe ich immer wieder vor diesem Problem. Gibt es da was elegantes? Wie ist das mit "Partition over"?
Oder geht nur der Ansatz
Select a.Kdnnr, a.Kunde, a.Datum, a.Ergebnis from Kundentabelle a where a.Datum =
(select max(b.Datum) from Kundentabelle b where a.Kdnnr = b.Kdnnr)order by Kdnnr, DatumUnd was wäre, wenn an einem Tag zwei Einträge existieren würden?
Vielen Dank schon mal
und schönen Abend
Karline
Antworten
-
Hallo Karline,
Version 1
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23) ;with t1 as ( select KdnNr, max(Datum) as Datum from @t1 group by KdnNr ) select t2.id,t2.KdnNr,t2.Kunde,t2.Datum,t2.Ergebnis from t1 inner join @t1 t2 on t1.KdnNr=t2.KdnNr and t1.Datum=t2.Datum order by t2.id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:47
-
Hallo Karline,
Version 2
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23) ;with t1 as( select row_number() over(partition by KdnNr order by Datum desc) as rn, id, KdnNr, Kunde, Datum, Ergebnis from @t1 ) select id, KdnNr, Kunde, Datum, Ergebnis from t1 where rn < 2 order by id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:46
-
Und was wäre, wenn an einem Tag zwei Einträge existieren würden?
Hallo Karline,hier solltest Du selbst entscheiden, ob die Daten aggregiert oder nur der zuletzt gespeicherte Datensatz zurück geliefert wird z.B.:
Version 3
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23), (1,'Kunde 1','2010-10-05',24) ;with t1 as( select row_number() over(partition by KdnNr order by Datum desc, id desc ) as rn, id, KdnNr, Kunde, Datum, Ergebnis from @t1 ) select id, KdnNr, Kunde, Datum, Ergebnis from t1 where rn < 2 order by id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:46
Alle Antworten
-
Hallo Karline,
Version 1
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23) ;with t1 as ( select KdnNr, max(Datum) as Datum from @t1 group by KdnNr ) select t2.id,t2.KdnNr,t2.Kunde,t2.Datum,t2.Ergebnis from t1 inner join @t1 t2 on t1.KdnNr=t2.KdnNr and t1.Datum=t2.Datum order by t2.id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:47
-
Hallo Karline,
Version 2
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23) ;with t1 as( select row_number() over(partition by KdnNr order by Datum desc) as rn, id, KdnNr, Kunde, Datum, Ergebnis from @t1 ) select id, KdnNr, Kunde, Datum, Ergebnis from t1 where rn < 2 order by id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:46
-
Und was wäre, wenn an einem Tag zwei Einträge existieren würden?
Hallo Karline,hier solltest Du selbst entscheiden, ob die Daten aggregiert oder nur der zuletzt gespeicherte Datensatz zurück geliefert wird z.B.:
Version 3
declare @t1 table ( id int identity(1,1), KdnNr int, Kunde varchar(255), Datum datetime, Ergebnis int ) insert into @t1 values (1,'Kunde 1','2010-08-10',50), (1,'Kunde 1','2010-09-20',57), (2,'Kunde 2','2010-08-13',43), (1,'Kunde 1','2010-10-05',23), (1,'Kunde 1','2010-10-05',24) ;with t1 as( select row_number() over(partition by KdnNr order by Datum desc, id desc ) as rn, id, KdnNr, Kunde, Datum, Ergebnis from @t1 ) select id, KdnNr, Kunde, Datum, Ergebnis from t1 where rn < 2 order by id
Gruß Yury- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 2. Dezember 2010 10:46