Gültigen Wert anhand Datum herausfinden

tw1985

Neuer Benutzer
Beiträge
3
Moin zusammen,

ich habe aktuell eine Liste mit zig Tausend Artikeln mit mehreren Preisen und dem dazugehörigen Gültigkeitsdatum in Form von Ab-Datum. Was fehlt, ist das bis-Datum. Ein Beispiel:

Artikel gültig ab Preis
4711 01.01.2023 100
4711 12.02.2023 103
4711 07.03.2023 105

Jetzt hätte ich gerne eine Auflistung die mir folgendes ausgibt:

Artikel gültig ab gültig bis Preis
4711 01.01.2023 11.02.2023 100
4711 12.02.2023 06.03.2023 103
4711 07.03.2023 28.03.2023 105

Es soll also im Prinzip die selbe Liste sein, allerdings ergänzt um das Bis-Datum, welches sich aus dem nächst höheren Ab-Datum -1 ergibt.

Hat hier jemand eine Ahnung, wie ich eine solche Liste erstelle? Ich wüsste nicht, wie ich hierzu das erforderliche Statement aufbauen soll.

Für Hilfe wäre ich echt dankbar!

VG
Tim
 
Werbung:
Das kann man mit lead() erreichen:

Code:
select t.*
from (
  select artikel, 
         gueltig_ab,
         lead(gueltig_ab) over (partition by artikel order by gueltig_ab) - 1 as gueltig_bis,
         preis
  from test
)

Du musst nur überlegen was für den letzten Eintrag als "gueltig_bis" verwendet werden soll. Der Code oben liefert NULL in diesem Fall.
 
Du brauchst auf jeden Fall einen Selfjoin der Tabelle mit sich selbst. Ideal finde ich es dabei mit einer ROW_NUMBER() zu arbeiten (die gibt es so in MSSQL, Postgre, etc. vermutlich auch in Oracle), theoretisch wäre das auch noch mit einem Aggregat denkbar.
Code:
WITH t(Zeile,Artikel,gültig_ab,Preis) AS (
SELECT ROW_NUMBER() OVER (PARTITION BY Artikel ORDER BY gültig_ab),*
FROM tabelle )
SELECT t1.*,t2.dateadd(day,-1,gültig_ab) AS gültig_bis
FROM t t1
LEFT JOIN t t2
ON t1.Artikel = t2.Artikel
AND t1.Zeile = t2.Zeile -1
PS: Stimmt mit lead() geht es vermutlich auch.
 
Danke euch schon mal. Das funktioniert top. Als "gültig bis" müsste dann sysdate gezogen werden. Wie müsste ich das denn umbauen, dass statt NULL das aktuelle Datum genutzt wird?
 
Werbung:
Zurück
Oben