Benutzer mit den meisten Antworten
SQL-Abfrage FehlendeTagesabschluesseAnzeigen

Frage
-
Hallo,
ich habe folgende Tabelle (vereinfacht):
buchungszeit, name, buchung
01.07.2013 07:00, frank mustermann, anfang
01.07.2013 07:30, frank musternann, ende
01.07.2013 08:00, frank mustermann, anfang
01.07.2013 07:00, ute musterfrau, anfang
01.07.2013 16:00, ute musterfrau, ende
[...]Nun möchte ich von jedem Tag (Funktionen YEAR(), MONTH(), DAY()) und Mitarbeiter den letzten Datensatz analysieren und wenn der kein "ende" ist, soll er angezeigt werden.
Wie kann man das in SQL performant formulieren?
mfg
Antworten
-
Hallo!
Das geht am einfachsten mit einer Window Function.
Declare @MyTable as Table(buchungszeit datetime, name varchar(20), buchung varchar(20)); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:00', 'frank mustermann', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:30', 'frank mustermann', 'ende'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 08:00', 'frank mustermann', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:00', 'ute musterfrau', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 16:00', 'ute musterfrau', 'ende'); Select buchungszeit, name, buchung, ROW_NUMBER() OVER(PARTITION BY name, convert(varchar(10), buchungszeit, 104) ORDER BY buchungszeit desc) as rn from @MyTable order by name, buchungszeit; With NumberedRows as ( Select buchungszeit, name, buchung, ROW_NUMBER() OVER(PARTITION BY name, convert(varchar(10), buchungszeit, 104) ORDER BY buchungszeit desc) as rn from @MyTable ) Select * from NumberedRows where rn = 1 and buchung <> 'ende';
Hier finden sich noch einige Hinweise, die es den anderen einfacher machen, solche Fragen zu beantworten:
Wie poste ich mein SQL Server Abfrage-Problem richtig, damit ich die beste Hilfe erhalte?Einen schönen Tag noch,
Christoph Muthmann
Microsoft SQL Server MVP - Blog- Als Antwort markiert HessischerBub Freitag, 2. August 2013 12:03
Alle Antworten
-
Hallo!
Das geht am einfachsten mit einer Window Function.
Declare @MyTable as Table(buchungszeit datetime, name varchar(20), buchung varchar(20)); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:00', 'frank mustermann', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:30', 'frank mustermann', 'ende'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 08:00', 'frank mustermann', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 07:00', 'ute musterfrau', 'anfang'); Insert into @MyTable(buchungszeit, name, buchung) values ('2013-07-01 16:00', 'ute musterfrau', 'ende'); Select buchungszeit, name, buchung, ROW_NUMBER() OVER(PARTITION BY name, convert(varchar(10), buchungszeit, 104) ORDER BY buchungszeit desc) as rn from @MyTable order by name, buchungszeit; With NumberedRows as ( Select buchungszeit, name, buchung, ROW_NUMBER() OVER(PARTITION BY name, convert(varchar(10), buchungszeit, 104) ORDER BY buchungszeit desc) as rn from @MyTable ) Select * from NumberedRows where rn = 1 and buchung <> 'ende';
Hier finden sich noch einige Hinweise, die es den anderen einfacher machen, solche Fragen zu beantworten:
Wie poste ich mein SQL Server Abfrage-Problem richtig, damit ich die beste Hilfe erhalte?Einen schönen Tag noch,
Christoph Muthmann
Microsoft SQL Server MVP - Blog- Als Antwort markiert HessischerBub Freitag, 2. August 2013 12:03
-
Hallo Christoph,
ich kam am Mittwoch noch auf eine Lösung mit "select ... from .... where .... (buchungszeitpunkt > ALL (select ...)).
Mit 8500 Datensätze, benötigt die Abfrage ca. 5 Sekunden.
Vorher hatte ich eine SQL-Abfrage, die am Anfang lief. Mit steigender Datenmenge verursachte die Abfrage ein Timeout (30 Sekunden).
Mit deiner Methode sind es unter 1 Sekunde, bis die Abfrage fertig ist.
Mit steigenden Datensätze wird das Verhältnis noch weiter auseinander gehen.
Vergleiche ich die Abfragekosten sind die beide nicht so weit auseinander. Zeitlich dagegen Welten.
mfg