Neue Herausforderung für SQL Kniffler

atlantis

Benutzer
Beiträge
16
Nachdem ich hier im Forum schon 2x sehr adäquate Hilfe bekommen habe ich mal wieder eine Nuss, die ich nicht selber knacken kann und schon seit einiger Zeit vor mir her schiebe...



Habe in einer Tabelle seit Jahren Preise zu Teilenummern mitgeschrieben, jeweils mit Einsatzdatum und Enddatum, um später eine Preisentwicklung darstellen zu können.

Um nicht jeden Tag auch bei gleichem Preis zum Vortag einen neuen Eintrag zu generieren habe ich stets in einer Spalte "Latest" den neusten Eintrag zu einer Teilenummer markiert. Erst wenn sich der neue Wert vom Latest Wert verändert hat wurde ein neuer Eintrag zur jeweiligen Teilenummer generiert mit Gültig ab dem Tagesdatum. Der vorangegangene Datensatz wurde mit einem gültig bis versehen mit gleichem Tagesdatum.


Das hat auch recht gut funktioniert. Leider hat meine (externe) Datenquelle über die Laufzeit zwischendurch ein paarmal Probleme bei der Übermittlung der Preise gehabt, was mir dann Zwischendurch plötzlich
mal 10fache 100fache oder 1000fache Werte des Teilepreises geliefert hat, da wahrscheinlich dort das Komma in der Export-Konvertierung einfach ignoriert wurde.

Die Preise selbst haben sich selbst im Bereich kleiner 20% verändert, so dass man diese Ausreisser deutlich erkennen kann.



Jetzt sitze ich vor eine Giganto-Tabelle mit 8,4 Mio. Einträgen bei ca. 1,2Mio unterschiedlichen Teilenummern, also ca. 8 pro Teilenummer, die ich gerne per SQL wieder korrigieren möchte.



Mein Ansatz war, gehe die Preistabelle per Schleife TLN für TLN durch und ersetze alle Preise, die es auch mit genau dem gleichem Betrag um den Faktor 1:10, 1:100 und 1:1000 gibt durch den jeweils kleinsten Wert dieser Teilenummer aus der Teilmenge 1:10, 1:100, 1:1000.



In Anbetracht dieser gigantischen Datenmenge glaube ich jedoch, dass dieser Ansatz mit 2 verschachtelten Schleifen nie zu einem Ende kommen wird.

Hat jemand einen eine Anregung, wie ich ggf. über Hilfstabellen, oder mehrere Schritte zum Ziel kommen könnte?



Ich habe mal die Testtabelle mit Datensätze von 3 Teilenummern als Anhang angehängt, um die Datenstruktur klar zu machen.



Bin gespannt auf Eure Anregungen…
 

Anhänge

  • Preis.txt
    19,5 KB · Aufrufe: 3
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
680
Wieso werden die falschen nicht gelöscht, statt andere zu flaggen?
Oder musst Du den Müll aus Gründen behalten?

Eine Abfrage könnte man z.B. so anlegen:
Code:
select * from test_preis x1 join test_preis x10 on (x1.tln,x1.preis) = (x10.tln,x10.preis*10)
oder falls dein Oracle das noch nicht kann
Code:
select * from test_preis x1 join test_preis x10 on x1.tln = x10.tln and x1.preis = x10.preis*10)
Ob das genau die Problemfälle ergibt, ob man noch Datumsgrenzen berücksichtigen muss usw. kannst Du sicher am besten beurteilen.
 

atlantis

Benutzer
Beiträge
16
Hallo dabadepdu

Vielen Dank für Deine Antwort, die allerdings noch etwas lagern musste...
Hatte Zwischenzeitlich höher priore Themen, die sich vor dieses Thema geschoben haben und dann Urlaub... Deswegen hatte ich mich nicht mehr gemeldet.

Ich denke, dass ich damit ans Ziel kommen kann und werde es jetzt mal testen.

Danke Dir für den Tipp.

Atlantis
 
Werbung:

atlantis

Benutzer
Beiträge
16
Habe auf Basis Deiner Idee das Thema jetzt mal so gelöst...

delete from TEST_PREIS DST
where DST.UPE_PK in
(
select X10.UPE_PK
from TEST_PREIS X1
inner join TEST_PREIS X10 on X1.TLN= X10.TLN and ( (x1.PREIS*10 = X10.PREIS) OR (x1.PREIS*100 = X10.PREIS))
);


Jetzt habe ich noch Einzelfälle, wo der Wert nicht genau 10 fach oder 100 fach so hoch war, siehe PK 29526426 oder 29526427 oder PK 29136413.

Und danach muss ich im Nachgang noch irgendwie die "von" und "bis" Zeiträume wieder gerade biegen um wieder korrekt Einsatzzeitpunkte ohne Lücken der jeweiligen Preise zu erhalten...

Gruss

Atlantis
 
Oben