Benutzer mit den meisten Antworten
Aufeinanderfolgende Datumsreihen erkennen und Zählen

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??
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
- Bearbeitet Christoph MuthmannEditor Mittwoch, 15. Oktober 2014 08:54
- Als Antwort vorgeschlagen Christoph MuthmannEditor Donnerstag, 16. Oktober 2014 07:37
- Als Antwort markiert Sammy1125 Montag, 20. Oktober 2014 10:57
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 -
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!?
- Akte 40131
-
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
- Bearbeitet Christoph MuthmannEditor Mittwoch, 15. Oktober 2014 08:54
- Als Antwort vorgeschlagen Christoph MuthmannEditor Donnerstag, 16. Oktober 2014 07:37
- Als Antwort markiert Sammy1125 Montag, 20. Oktober 2014 10:57