PDA

View Full Version : Frage an die SQL-Profis



malzusrex
24-03-21, 09:48
Hallo Gemeinde,

ich hätte da mal eine Frage, ob man folgendes Problem elegant mit einem SQL lösen kann.

Ich habe eine Tabelle mit 3 Key-Felder und ein Von- und Bis-Wert. (Die restlichen Felder des Satzes sind bei gleiche Key immer identisch, deshalb lass ich die hier mal weg)

In der Tabelle gibt es bei gleichen Key mehrer Sätze, wo ein Satz mit einem VON-Wert beginnt, der dem Satz davor dem BIS-Wert + 1 entspricht. Wenn das der Fall ist, so möchte ich aus diesen 2 (Oder auch mehr) Sätzen einen machen, wo der VON-Wert = dem VON-Wert des ersten Satzes und der BIS-Wert gleich dem BIS-Wert des letzten Satzes ist.

Ausgang:


Key1 Key2 Key3 von bis
1 1 1 10001 10005
1 1 1 10006 10010
1 1 2 10011 10015
1 1 1 10016 10020
1 1 1 10021 10030
1 1 1 10031 10057


Und so sollte das Ziel aussehen


Key1 Key2 Key3 von bis
1 1 1 10001 10010
1 1 2 10011 10015
1 1 1 10016 10057


Ist das überhaupt mit SQL möglich?

Liebe Grüße
Ronald

Fuerchau
24-03-21, 10:19
Schau dir da mal die OLAP-Funktionen an.
Hier kannst du ggf. mit Min/Max und Partition order by zum gewünschten Ergebnis auf dem Einzelsatz kommen.
Dieses gruppierst du dann wieder über die Schlüssel mit den Min/Max auf das errechnete obige Ergebnis.

GerhardG
25-03-21, 10:22
Hallo,
so sollte es auch gehen:



with data (Key1, Key2, Key3, von, bis) as (values
(1, 1, 1, 10001, 10005),
(1, 1, 1, 10006, 10010),
(1, 1, 2, 10011, 10015),
(1, 1, 1, 10016, 10020),
(1, 1, 1, 10021, 10030),
(1, 1, 1, 10031, 10057)
),
sort (Key1, Key2, Key3, von, bis, rn) as (
select key1,
key2,
key3,
von,
bis,
row_number() over (order by key1,key2,key3)
from data
),
gruppen (crn, grp_Key1, grp_Key2, grp_Key3, grp_von, grp_bis, gruppe) as (
select rn,
key1,
key2,
key3,
von,
bis,
1
from sort
where rn = 1
union all
select rn,
key1,
key2,
key3,
case when (key1, key2, key3) <> (grp_key1, grp_key2, grp_key3) then von
when von > grp_bis + 1 then von
else grp_von
end,
bis,
case when (key1, key2, key3) <> (grp_key1, grp_key2, grp_key3) then gruppe + 1
when von > grp_bis + 1 then gruppe + 1
else gruppe
end
from gruppen
inner join sort on crn + 1 = rn
)

select grp_key1,
grp_key2,
grp_key3,
min(grp_von),
max(grp_bis)
from gruppen
group by grp_key1,grp_key2,grp_key3,gruppe
order by min(grp_von)

1 1 1 10001 10010
1 1 2 10011 10015
1 1 1 10016 10057