Gruppierung von Datum

g.kieninger

Neuer Benutzer
Beiträge
3
Hallo!

Ich habe folgende Situation und stehe momentan auf dem Schlauch. Ich habe folgende Tabelle

Datum;Menge
2017-08-10;5
2017-08-11; 5
2017-08-12; 5
2017-08-15; 7
2017-08-20;5

Und ich möchte jetzt als Resultat Zeiträume haben die die gleiche Menge haben, also das Ergebnis schaut wie folgt aus:

2017-08-10;2017-08-12;5
2017-08-15;2017-08-15;7
2017-08-20;2017-08-20;5

Und mein Hirn ist derzeit wie vernagelt und ich finde keine passende Lösung.
Vielen Dank für jede Hilfe.
 
Werbung:
Schnellschu? eine Funktion, die durch diese Tabelle geht (geordnet nach Datum) und prüft, ob Vorgänger und aktueller record gleich sind und das sind merkt. Wenn es wechselt, den Zwischenstand ausgeben.
 
Code:
test=# select * from datum ;
  datum  | val
------------+-----
 2017-08-10 |  5
 2017-08-11 |  5
 2017-08-12 |  5
 2017-08-15 |  7
 2017-08-20 |  5
(5 rows)

test=# select *, case when (lag(datum) over (order by datum) = datum-1) or lag(datum) over (order by datum) is NULL then 1 else 0 end as x from datum ;
  datum  | val | x
------------+-----+---
 2017-08-10 |  5 | 1
 2017-08-11 |  5 | 1
 2017-08-12 |  5 | 1
 2017-08-15 |  7 | 0
 2017-08-20 |  5 | 0
(5 rows)

Durch dieses Ergebniss gehen. Wenn x=1 ist Record noch aufheben. Wenn x=0 ist, bisherige Sammlung ausgeben, aktuellen Satz wieder aufheben.
 
Ich habe mir jetzt mal Testdaten für SqLite3 gemacht um schneller testen zu können und damit komme ich zum richtigen Ergebnis
(Hier habe ich die 'echte' DB-struktur)
Schaut das nur richtig aus, oder ist es das auch?

Select
ObjektTyp_id,
Min(Datum) as FirstDatum,
LastDatum,
Frei
from (

Select
ObjektTyp_id,
Datum,
CoalEsce((Select Max(Datum) from mc_belegung b2
where b.ObjektTyp_id = ObjektTyp_id
and b2.Datum >= b.Datum
and ((
b.frei = b2.frei
and
(Select frei from mc_Belegung b3
where b3.ObjektTyp_id = b2.ObjektTyp_id
and b3.Datum = date(b2.Datum,'+1 day')
) = b.frei
)
or
(
(Select frei from mc_Belegung b3
where b3.ObjektTyp_id = b2.ObjektTyp_id
and b3.Datum = date(b2.Datum,'-1 day')
) = b.frei
)
)
),Datum) as LastDatum,
Frei
from mc_Belegung b
Order by
ObjektTyp_id
)
Group by
ObjektTyp_id, LastDatum, Frei
Order by
ObjektTyp_id, FirstDatum, LastDatum, Frei
 
Werbung:
Zurück
Oben