Datumswerte aus mehreren Zeilen addieren, mit Bedingung

ny_unity

SQL-Guru
Beiträge
208
Hallo :cool:

ich habe folgenden Aufbau:

Personalnr, datumvon, datumbis

Hier können mehrere Einträge stehen aus den letzten zwölf Monaten. Ich möchte aber weiterhin nur Zeilen angezeigt bekommen, wo datumvon nicht größer als sechs Monate von der Zeile zu vor ist.

Also:

Zeile 1:5282 | 01.08.2023 | 05.08.2023 | 6
Zeile 2:5282 | 05.07.2023 | 06.07.2023 | 2
Zeile 3:5282 | 05.11.2022 | 13.11.2022 | 9
Zeile 4:5282 | 01.10.2022 | 31.10.2022 | 31

Zeile 1 das Startdatum ist nicht größer als das Enddatum in Zeile 2, also können diese beiden Datumsdifferenzen zusammenaddiert werden. Das Startdatum in Zeile 2 ist aber größer als sechs Monate von Zeile 3, die nachfolgenden Zeilen sollen also nicht mehr beachtet werden.

Mein Endergebnis, bzw. die Ausgabe der Abfrage soll sein:

5282 | 8

Hat jemand einen Denkansatz für mich?

Viele Grüße

Erik
 
Werbung:
Code:
postgres=# create table bla(id int primary key, val int);
CREATE TABLE
postgres=# copy bla from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1    10
>> 2    12
>> 3    20
>> 4    21
>> 5    55
>> \.
COPY 5
postgres=# select *, lag(val) over (order by id), case when lag(val) over (order by id) > 20 then true else false end as greater_than_20 from bla;
 id | val | lag | greater_than_20 
----+-----+-----+-----------------
  1 |  10 |     | f
  2 |  12 |  10 | f
  3 |  20 |  12 | f
  4 |  21 |  20 | f
  5 |  55 |  21 | t
(5 rows)

postgres=#

Prost.
 
Werbung:
@akretschmer

danke, habs gelöst mit deiner Hilfe :)
SQL:
select personalnr, nachname, eintritt, austritt, datumvon, datumbis, case when lag(innerhalb_sechs_monate) over (order by personalnr asc, datumbis desc) = false then false else innerhalb_sechs_monate end as innerhalb_sechs_monate
from
    (
    select     personalnr, nachname, vorname, eintritt, austritt, datumvon, datumbis,
        lag(datumvon) over (order by personalnr asc, datumbis desc),
        case when case when datumbis >= lag(datumvon) over (order by personalnr asc, datumbis desc) - interval '6 month' then true else false end = false and datumbis >= lag(datumvon) over (order by personalnr asc, datumbis desc) is null
            then true
            else case when datumbis >= lag(datumvon) over (order by personalnr asc, datumbis desc) - interval '6 month' then true else false end end as innerhalb_sechs_monate
    from
        (
        select     ep.personalnr, trim(p.nachname) as nachname, trim(p.vorname) as vorname, cast(pz.dttechneintritt as date) as eintritt, cast(p.austritt1 as date) as austritt,
            cast(ep.datumvon as date) as datumvon, cast(ep.datumbis as date) as datumbis
        from     einspers ep
        inner join personal p on ep.personalnr = p.personalnr
        inner join personalzus pz on p.personalnr = pz.personalnr
        where     p.personalnr = 11990 and ep.kb in ('KK', 'VK', 'KL', 'KF') and ep.datumvon >= current_date - interval '12 month' and
            (p.austritt1 is null or p.austritt1 >= current_date - interval '3 month') and p.geschst = 1
        order by ep.personalnr asc, ep.datumvon desc
        ) t1
    ) t2
 
Zurück
Oben