none
Suche nach kleinstem und größtem Zeitwert pro Tag RRS feed

  • Frage

  • Hallo,


    ich habe eine Abfrage, die über mehrere Tabellen hinweg geht:

    SELECT DISTINCT
        LK.Nr AS Nr,
        KAL.DatAnfang AS Beginn,
        KAL.DatEnde AS Ende,
        (datepart(hour, (KAL.DatEnde-KAL.DatAnfang))*60) + datepart(MINUTE, (KAL.DatEnde-KAL.DatAnfang)) AS Minuten
    FROM Lehrkraft AS LK
    JOIN MassnahmenTN AS MTN ON MTN.Lehrkraft = LK.LehrkraftNr
    JOIN Kalender AS KAL ON KAL.TNRec = MTN.TNRec
    WHERE     (MTN.MassnahmeNr LIKE 'Schule1')


    Dabei erhalte ich folgendes Ergebnis (im Auszug):

    Nr	Beginn			Ende			Minuten
    193	2013-08-21 17:00:00.000	2013-08-21 19:15:00.000	135
    193	2013-08-23 16:00:00.000	2013-08-23 18:15:00.000	135
    193	2013-09-04 16:00:00.000	2013-09-04 18:15:00.000	135
    193	2013-09-04 17:00:00.000	2013-09-04 19:15:00.000	135
    193	2013-09-04 17:30:00.000	2013-09-04 19:45:00.000	135
    193	2013-09-04 17:45:00.000	2013-09-04 20:00:00.000	135
    193	2013-09-06 14:00:00.000	2013-09-06 16:15:00.000	135
    204	2013-11-11 15:00:00.000	2013-11-11 18:00:00.000	180
    204	2013-11-11 15:15:00.000	2013-11-11 18:15:00.000	180
    204	2013-11-11 15:30:00.000	2013-11-11 17:45:00.000	135
    204	2013-11-12 11:30:00.000	2013-11-12 13:45:00.000	135
    

    Man kann sehen, dass die selbe Person an einem Tag mehrere Eintragungen hatte, die sich auch überschneiden dürfen.

    Wie kann man nun die Abfrage so gestalten, dass entweder in jeder Zeile den früheste Beginn und das späteste Ende pro Tag darstellt oder jeden Tag zusammenfasst und dann den frühesten und spätesten aufführt.

    Im Fall oben also:

    Nr	Beginn			Ende			Minuten
    193	2013-08-21 17:00:00.000	2013-08-21 19:15:00.000	135
    193	2013-08-23 16:00:00.000	2013-08-23 18:15:00.000	135
    193	2013-09-04 16:00:00.000	2013-09-04 20:00:00.000	240
    193	2013-09-06 14:00:00.000	2013-09-06 16:15:00.000	135
    204	2013-11-11 15:00:00.000	2013-11-11 18:15:00.000	195
    204	2013-11-12 11:30:00.000	2013-11-12 13:45:00.000	135
    

    Sollte das nicht gehen, muss ich eine Lösung in Excel finden. Die das aus der oberen Tabelle erzeugt.

    Ich bin dankbar für jeden Tipp :)

    Mario


    Freitag, 28. März 2014 07:40

Antworten

  • Hallo Mario, schau Dir mal dies Beispiel an:

    Declare @Daten as Table(Nr integer, Beginn datetime, Ende datetime, Minuten
    integer);
    
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130821
    17:00:00.000', '20130821 19:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130823
    16:00:00.000', '20130823 18:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    16:00:00.000', '20130904 18:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:00:00.000', '20130904 19:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:30:00.000', '20130904 19:45:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:45:00.000', '20130904 20:00:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130906
    14:00:00.000', '20130906 16:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:00:00.000', '20131111 18:00:00.000', 180);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:15:00.000', '20131111 18:15:00.000', 180);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:30:00.000', '20131111 17:45:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131112
    11:30:00.000', '20131112 13:45:00.000', 135);
     With NumberedRows
    as
    (
    Select Nr, Min(Beginn) as Start, Max(Ende) as Ende
    from @Daten
    group by Nr, cast(Beginn as date)
    )
    Select Nr, Start, Ende, Datediff(MINUTE, Start, Ende) as Minuten
    from NumberedRows
    order by Nr, Start
    ;

    HTH!

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Freitag, 28. März 2014 13:06
    Beantworter

Alle Antworten

  • Hallo Mario, schau Dir mal dies Beispiel an:

    Declare @Daten as Table(Nr integer, Beginn datetime, Ende datetime, Minuten
    integer);
    
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130821
    17:00:00.000', '20130821 19:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130823
    16:00:00.000', '20130823 18:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    16:00:00.000', '20130904 18:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:00:00.000', '20130904 19:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:30:00.000', '20130904 19:45:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130904
    17:45:00.000', '20130904 20:00:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (193, '20130906
    14:00:00.000', '20130906 16:15:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:00:00.000', '20131111 18:00:00.000', 180);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:15:00.000', '20131111 18:15:00.000', 180);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131111
    15:30:00.000', '20131111 17:45:00.000', 135);
    Insert into @Daten(Nr, Beginn, Ende, Minuten) Values (204, '20131112
    11:30:00.000', '20131112 13:45:00.000', 135);
     With NumberedRows
    as
    (
    Select Nr, Min(Beginn) as Start, Max(Ende) as Ende
    from @Daten
    group by Nr, cast(Beginn as date)
    )
    Select Nr, Start, Ende, Datediff(MINUTE, Start, Ende) as Minuten
    from NumberedRows
    order by Nr, Start
    ;

    HTH!

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Freitag, 28. März 2014 13:06
    Beantworter
  • Ok, ich habe vergessen zu erwähnen, dass die Liste nach meiner Abfrage knapp 6000 Zeilen lang ist. Die kann man ja nicht alle per Hand eingeben. :)
    Freitag, 28. März 2014 13:48
  • So war das Beispiel auch nicht gedacht!

    Packe Dein ursprüngliches Select in eine CTE (Common Table Expression) (siehe NumberedRows in meinem Beispiel) und verwende diese CTE als Input für meine CTE.

    Fertig!

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Freitag, 28. März 2014 14:00
    Beantworter
  • Hallo und vielen Dank,

    das Konstrukt mit CTE war mir bisher nicht bekannt, läuft aber.

    Da es sehr viele Zeilen sind, konnte ich noch nicht abschließend klären, ob wirklich alle Daten korrekt sind, aber die Tabelle wurde von 6000 auf ca. 1700 Zeilen eingedampft. :)

    Bye,
    Mario

    Montag, 31. März 2014 12:33