none
Aufeinanderfolgende Datumsreihen erkennen und Zählen RRS feed

  • Frage

  • SQL Server 2012


    Hallo,

    ich suche nach einer Lösung für folgendes Problem:

    Für eine Akte gibt es in einer Tabelle pro Ereignis ein Datum (immer Monatsultimo). Ich soll jetzt aufeinanderfolgende Ereignisse identifizieren und zählen.

    Bsp.

    Akte EreignisNr EreignisDatum
    40131 2927 20131031
    40131 3782 20131231
    40131 4457 20140131
    40131 5566 20140228
    40198 1692791 20130331
    40198 1778278 20130930
    40198 1845722 20140228
    40198 1860852 20140331
    40198 1875485 20140430
    40198 1889011 20140531

    Das Ergebnis sollte so aussehen:

    Akte EreignisNr EreignisDatum Rang
    40131 2927 20131031 1
    40131 3782 20131231 1
    40131 4457 20140131 2
    40131 5566 20140228 3
    40198 1692791 20130331 1
    40198 1778278 20130930 1
    40198 1845722 20140228 1
    40198 1860852 20140331 2
    40198 1875485 20140430 3
    40198 1889011 20140531 4

    Sieht jemand eine Lösung??


    Dienstag, 14. Oktober 2014 17:04

Antworten

  • Dazu musst Du etwas Logik zur Erkennung von Dateninseln implementieren.

    Siehe hierzu meinen Artikel Dateninseln erkennen und auswerten

    Dazu passt dann dieser Code:

    Declare @Akten as Table(Akte int, EreignisNr int, EreignisDatum date); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 2927 ,'20131031'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 3782 ,'20131231'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 4457 ,'20140131'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 5566 ,'20140228'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1692791 ,'20130331'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1778278 ,'20130930'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1845722 ,'20140228'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1860852 ,'20140331'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1875485 ,'20140430'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1889011 ,'20140531'); SELECT Akte, EreignisDatum, DATEDIFF(MONTH, '2012-01-01', EreignisDatum) - DENSE_RANK() OVER(ORDER BY DATEDIFF(MONTH, '2012-01-01', EreignisDatum)) AS Diff FROM @Akten
    order by Akte, EreignisDatum; With Inseln as (SELECT Akte, EreignisDatum, DATEDIFF(MONTH, '2012-01-01', EreignisDatum) - DENSE_RANK() OVER(ORDER BY DATEDIFF(MONTH, '2012-01-01', EreignisDatum)) AS Diff FROM @Akten ) SELECT Akte, EreignisDatum, RANK() OVER (PARTITION BY Akte, Diff ORDER BY EreignisDatum) as Rang FROM Inseln ;

    HTH!

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



    Mittwoch, 15. Oktober 2014 08:50
    Beantworter

Alle Antworten

  • Hallo

    ich bin nicht sicher, ob ich die Logik in dem Ergebnis erkennen kann.

    Eine Beschreibung wäre vielleicht nicht verkehrt gewesen.

    Aber grundsätzlich wird es sicherlich mit den Ranking-Funktionen des SQL Server funktionieren. Diese findest Du hier samt Beispielen dokumentiert : Rangfolgefunktionen (Transact-SQL)


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    Dienstag, 14. Oktober 2014 19:26
  • Hallo,

    vielen Dank für die schnelle Antwort!!

    Ich versuche mich mal klarer Auszudrücken ;-)

    • Akte 40131

      Das Ereignis 2927 am 20131031 steht alleine (Insel). Solche Fälle interessiern mich nicht. Könnten auch herausgefiltert werden.
      Im Zeitraum 20131231 - 20140228 gibt es aber in 3 aufeinanderfolgenden Monaten ein Ereignis. Diese interessieren mich. Die Anzahl der aufeinanderfolgenden Ereignisse ist mir wichtig, da ab 3 eine Eskalation erfolgen soll.

      Die Spaltenüberschrift "Rang" ist wohl etwas irreführend. Sorry.

    Soweit ich die Ranking-Funktionen verstanden habe, passen sie nicht auf mein Problem.

    Vielleicht ist es jetzt etwas klarer!?




    Mittwoch, 15. Oktober 2014 08:32
  • Dazu musst Du etwas Logik zur Erkennung von Dateninseln implementieren.

    Siehe hierzu meinen Artikel Dateninseln erkennen und auswerten

    Dazu passt dann dieser Code:

    Declare @Akten as Table(Akte int, EreignisNr int, EreignisDatum date); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 2927 ,'20131031'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 3782 ,'20131231'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 4457 ,'20140131'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40131, 5566 ,'20140228'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1692791 ,'20130331'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1778278 ,'20130930'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1845722 ,'20140228'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1860852 ,'20140331'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1875485 ,'20140430'); Insert into @Akten(Akte, EreignisNr, EreignisDatum) Values (40198, 1889011 ,'20140531'); SELECT Akte, EreignisDatum, DATEDIFF(MONTH, '2012-01-01', EreignisDatum) - DENSE_RANK() OVER(ORDER BY DATEDIFF(MONTH, '2012-01-01', EreignisDatum)) AS Diff FROM @Akten
    order by Akte, EreignisDatum; With Inseln as (SELECT Akte, EreignisDatum, DATEDIFF(MONTH, '2012-01-01', EreignisDatum) - DENSE_RANK() OVER(ORDER BY DATEDIFF(MONTH, '2012-01-01', EreignisDatum)) AS Diff FROM @Akten ) SELECT Akte, EreignisDatum, RANK() OVER (PARTITION BY Akte, Diff ORDER BY EreignisDatum) as Rang FROM Inseln ;

    HTH!

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



    Mittwoch, 15. Oktober 2014 08:50
    Beantworter
  • Hallo, vielen Dank! Ich habe die Logik verstanden und bei mir eingebaut.
    Montag, 20. Oktober 2014 10:58