Lücken in Zeiträumen erkennen

RSA_akt

Neuer Benutzer
Beiträge
1
Hallo,

ich habe folgendes Ergebnis aus einem Select:

PERSON BEGINN ENDE
---------------- ---------- ----------
663310696134331 01.08.2010 13.06.2013
663310696134331 25.06.2013 26.06.2013
663310696134331 15.07.2013 19.09.2013
663310696134331 27.10.2013 11.10.2013

Jetzt würde ich gerne diese Zeiträume selektieren, welche vom Ende des betreffenden bis zum Beginn des nächsten Zeitraumes maximal 1 Monat bzw. 30 Tagen liegen. Also im nächsten Ergebnis sollen hier die ersten zwei Zeiträume erscheinen, zwischen dem dritten und dem vierten Zeitraum liegen mehr als 30 Tage.

Hinweis: Dieses Ergebnis ist hier auf eine Person reduziert. In der Datenbank liegen mehrere 1000 Personen, die alle eine unterschiedliche Nummern aber mehrere Zeiträume aufweisen.

Hat jemand einen Ansatz, wie ich die Abfrage weiter aufbauen kann? Ich komm grad nicht mehr weiter.
 
Werbung:
Werbung:
Ansonsten wäre ein Join möglich. Sofern die Zeiträume einer Person sich nicht überschneiden können, glaube ich nicht das es hier Probleme gibt. Dein letzter Beispieldatensatz ist allerdings komisch, BEGINN liegt nach ENDE, vermutlich ein Tippfehler.
Code:
WITH tabelle AS (  
SELECT    ROW_NUMBER() OVER (ORDER BY person,beginn) AS zeilennr,
        person,
        beginn,
        ende
FROM    (
SELECT    663310696134331 AS person,
        cast('2010-01-08 00:00:00.000' AS DATETIME) AS beginn,
        cast('2013-13-06 00:00:00.000' AS DATETIME) AS ende
UNION ALL
SELECT    663310696134331 AS person,
        cast('2013-25-06 00:00:00.000' AS DATETIME) AS beginn,
        cast('2013-26-06 00:00:00.000' AS DATETIME) AS ende
UNION ALL
SELECT    663310696134331 AS person,
        cast('2013-15-07 00:00:00.000' AS DATETIME) AS beginn,
        cast('2013-19-09 00:00:00.000' AS DATETIME) AS ende
UNION ALL
SELECT    663310696134331 AS person,
        cast('2013-27-10 00:00:00.000' AS DATETIME) AS beginn,
        cast('2013-10-11 00:00:00.000' AS DATETIME) AS ende
        ) t
)

SELECT    t1.person,
        t1.beginn,
        t1.ende,
        t2.beginn AS naechster_beginn
FROM    tabelle t1
LEFT JOIN tabelle t2
ON        t1.person = t2.person
AND        t1.zeilennr = t2.zeilennr - 1
WHERE    datediff(day,t1.beginn,t2.beginn) <= 30
Der UNION Teil ist quasi nur die Erzeugung deiner Tabelle. ROW_NUMBER() ist hier entscheidend, das ist MSSQL. Gibts vermutlich auch in DB2, datediff() bestimmt auch in ähnlicher Form.
 
Zurück
Oben