1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Lücken in Zeiträumen erkennen

Dieses Thema im Forum "DB2" wurde erstellt von RSA_akt, 1 Oktober 2014.

  1. RSA_akt

    RSA_akt Neuer Benutzer

    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.
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Kann DB/Halbe lag()? Das ist eine Window-Funktion, mit der man auf Vorgänger-Records zugreifen kann, kann Oraggle und PostgreSQL, bei DB/Halbe weiß ich es nicht.
     
  3. ukulele

    ukulele Datenbank-Guru

    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.
     

Diese Seite empfehlen