Auswertung Klimadaten: Trocken- und Regenphasen

m21h_

Neuer Benutzer
Beiträge
3
Hallo Forum :)

Ich bin absoluter SQL-Neuling, beschäftige mich aber zwecks Auswertung seit einigen Tagen hiermit.
Ich werte Klimadaten aus. Die Tabellen bestehen u.a. aus der Stationsnummer (STATIONS_ID), dem Messdatum (MESS_DATUM) sowie der Niederschlagshöhe (RS). Bis jetzt haben die Abfragen mehr oder weniger gut geklappt, aber nun hänge ich fest. Ich möchte nun die längste Trocken- sowie Regenphase eines Jahres suchen. Er soll also pro Jahr den längsten Abschnitt finden, wenn die Niederschlagshöhe über 0 ist (für die Regenphase) und = 0 ist (für die Trockenphase).
Meine Idee bis jetzt

select
STATIONS_ID,
extract (year from MESS_DATUM) as Jahr,
count (case when RS > 0) as Regentage

from
stationsname
group by extract (MESS_DATUM)
order by STATIONS_ID;

Das klappt, wie ihr euch denken könnt, so noch nicht. Das Problem ist, dass ich vorher nur Zeiträume hatte, die ich selbst definiert habe. Z.B. für eine Woche "rows between 6 preceding and 0 following). Jetzt habe ich aber einen offenen Zeitraum, er soll mir ja sagen, wie viele Tage es pro Jahr gibt, die ohne/mit Niederschlag sind.
Vielleicht weiß jemand eine Lösung und kann mir helfen.

Viele Grüße und Danke im Voraus
 
Werbung:
Code:
test=*# select * from m21h ;
   datum    | regenmenge
------------+------------
 2018-08-01 |         10
 2018-08-02 |         12
 2018-08-03 |         13
 2018-08-04 |          0
 2018-08-05 |          0
 2018-08-06 |          0
 2018-08-07 |          0
 2018-08-08 |          0
 2018-08-09 |          0
 2018-08-10 |          0
 2018-08-11 |         10
 2018-08-12 |         15
(12 rows)

test=*# with tmp as (
  select
    *
    , case when lag(regenmenge) over (order by datum) = 0 and regenmenge = 0 or regenmenge = 0 then 'trocken' else 'regen' end as periode
  from m21h
)
, tmp2 as (
  select *
  , case when lag(periode)over (order by datum) != periode or row_number() over (order by datum) = 1 then 1 else 0 end as changed
  from tmp
)
, tmp3 as (
  select
    datum
    , periode
  from tmp2
  where changed = 1
)
select
  *
  , lead(datum) over (order by datum) - datum as dauer
  from tmp3
  order by datum
;
   datum    | periode | dauer
------------+---------+-------
 2018-08-01 | regen   |     3
 2018-08-04 | trocken |     7
 2018-08-11 | regen   |     
(3 rows)

test=*#

Hilft das?
 
Es klappt, super, danke für deine Mühe!
Was müsste ich ergänzen, wenn er mir nur jeweils die längste Trocken- sowie Regenphase eines Jahres ausgeben soll?
 
Nun, da gibt es mehrere Lösungen...

Code:
test=*# with tmp as (
  select
    *
    , case when lag(regenmenge) over (order by datum) = 0 and regenmenge = 0 or regenmenge = 0 then 'trocken' else 'regen' end as periode
  from m21h
)
, tmp2 as (
  select *
  , case when lag(periode)over (order by datum) != periode or row_number() over (order by datum) = 1 then 1 else 0 end as changed
  from tmp
)
, tmp3 as (
  select
    datum
    , periode
  from tmp2
  where changed = 1
)
, tmp4 as (
  select
    *
    , lead(datum) over (order by datum) - datum as dauer
    from tmp3
    order by datum
)
, tmp5 as (
  select
    *
    , row_number() over (partition by periode order by dauer desc)
  from tmp4
  where dauer is not null
)
select
  datum
  , periode
  , dauer
from tmp5
where row_number = 1
;
   datum    | periode | dauer
------------+---------+-------
 2018-08-01 | regen   |     3
 2018-08-04 | trocken |     7
(2 rows)

test=*#

um mal eine zu zeigen.
 
Werbung:
Zurück
Oben