none
SQL-Abfrage FehlendeTagesabschluesseAnzeigen RRS feed

  • 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

    Mittwoch, 31. Juli 2013 10:25

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
    Mittwoch, 31. Juli 2013 11:19

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
    Mittwoch, 31. Juli 2013 11:19
  • 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
    Freitag, 2. August 2013 12:18