SQL - verschieben des Detailsatzes in einem LEFT JOIN

Zvoni

Erfahrenes Mitglied
Mahlzeit,
mir ist kein besserer Titel eingefallen.

Versuche gerade eine richtig harte Nuss zu knacken.
Hier ein fiddle zur Darstellung: DB Fiddle - SQL Database Playground

Problem:
Ich habe 3 Sätze/Aufträge im Verkauf, gleicher Artikel, unterschiedliches Lieferdatum


Ich habe 3 Sätze/Aufträge im Einkauf, gleicher Artikel, unterschiedliches Lieferdatum

Jetzt versuche ich (Siehe SQL im fiddle), die EK-Bestellungen an die richtige Stelle des Verkaufs zu "sortieren".
Dazu vergleiche ich im LEFT JOIN auf BETWEEN mit dem vorhergehenden VK-Datum und "aktuellem" VK-Datum.

Funzt einwandfrei solange ich in dem "VK-Zeitfenster" auch nur eine Bestellung habe.
(Im fiddle einfach beim letzten Orders-INSERT das Datum auf 2024-08-02 setzen, dann seht ihrs)

Habe ich zwei (oder mehr) EK-Bestellungen die in so ein Fenster passen, dupliziert (tripliziert usw.) es mir den VK-Satz

Wie bekomme ich es hin, dass die "überschüssige" EK-Bestellung dem "nächsten" VK-Satz zugeordnet wird?
Denke die ganze Zeit, es müsste über ein CASE WHEN gehen, aber ich komme nicht dahinter.

Prinzipiell: Es soll nur die tatsächliche Anzahl VK-Sätze mit "passenden" EK-Bestellungen angezeigt werden. "Überschüssige" EK-Bestellungen werden hinten raus ignoriert (Bsp. 3 VK-Sätze, aber 5 EK-Sätze die ins gesamte Zeitfenster passen, es sollen dann auch nur die ersten 3 EK-Bestellungen zu den VK-Sätzen zugeordnet werden).

Mir ist klar, dass ich das im Frontend, in welchem das SQL später genutzt wird per Code aufdröseln könnte.
Dazu müsste ich aber das SQL in zwei separate Abfragen splitten plus Durchlauf zweier verschachtelter Schleifen.
Bei im Schnitt 5K VK-Sätzen wird dass dann suboptimal

Hoffe ich war verständlich
 
EK-ID=13 soll VK-ID=3 zugeordnet werden
Das Problem ist dass EK-ID=13 vom Liefertermin in das Fenster zwischen VK-ID1 und 2 "passt", dort aber der VK-ID=2 schon EK-ID=12 zugeordnet ist

Versteh mich nicht falsch: Dass EK-ID=13 der VK-ID=2 zugeordnet ist, ist per se erst mal nicht falsch, da mein Vergleichskriterium ja erfüllt ist (EK-Liefertermin liegt zwischen den Terminen von VK-ID1 und 2), aber der Slot eigentlich schon von EK-ID=12 schon besetzt ist, und es mir deshalb VK-ID=2 "dupliziert"
 
Ok, das ist eine nette Aufgabe. Ich studiere da mal ein wenig herum. Habe schn lange keine SQL Lösungen mehr gesucht - nettes Hirntraining:)
 
Zuletzt bearbeitet:
Habe mal die Logik geändert. Einfach die Reihenfolge verbunden. Erstes von Sale ist auch das Erste von Orders. Etc.

DB Fiddle - SQL Database Playground
SQL:
WITH matrix AS (
    SELECT *,
        ROW_NUMBER() OVER(PARTITION BY vkid, vk_part_no ORDER BY ek_date) AS ek_rid,
        ROW_NUMBER() OVER(PARTITION BY ekid, ek_part_no ORDER BY vk_date) AS vk_rid
    FROM
        (SELECT vkid, part_no AS vk_part_no, shipdate as vk_date FROM sales) vk,
        (SELECT ekid, part_no AS ek_part_no, shipdate as ek_date FROM orders) ek
    WHERE
        vk_part_no = ek_part_no
)
SELECT *
FROM matrix
WHERE vk_rid = ek_rid
Code:
| vkid | vk_part_no | vk_date    | ekid | ek_part_no | ek_date    | ek_rid | vk_rid |
| ---- | ---------- | ---------- | ---- | ---------- | ---------- | ------ | ------ |
| 1    | 100454     | 2024-04-08 | 11   | 100454     | 2024-03-12 | 1      | 1      |
| 2    | 100454     | 2024-07-22 | 12   | 100454     | 2024-06-03 | 2      | 2      |
| 3    | 100454     | 2024-08-12 | 13   | 100454     | 2024-07-02 | 3      | 3      |
 
Hmm......werde ich mal testen.
An ROW_NUMBER hatte ich auch gedacht, bin aber irgendwie im Kreisverkehr stecken geblieben.
 
Zurück