Moin warfatz,
freut mich - ich begann schon zu zweifeln,
Noch als letzte Anmerkungen zu deinemr erweiterten Variante:
a) Aus meiner Sicht wird es aus Performance-Gründen vermutlich sinnvoller sein, das "WHERE Treffer-in-Fertigungsauftrag" nicht erst im äußersten SELECT ins Spiel zu bringen, sondern im innersten SELECT, dort wo die Arbeitsplandaten geholt werden. Also bevor da irgendwelche analytischen Funktionen drüberschrapeln.
b) die "agpos_id", die du als erste Spalte anzeigst, ist als Sortierkriteriun vielleicht sinnvoll, falls du noch ein ORDER BY drunterhängst.
Aber für den End-Benutzer ist es nur verwirrend. Kennt keiner, ist nur intern zur Verarbeitung im Statement erforderlich - nimm es raus aus der Resultset-Ausgabe.
c) ich habe mal das Statement bzgl. der WHERE-Bedingung umgestellt und dabei auch den Alias "main" ersetzt. "main" stammte ja aus einer Variante, als es auch noch ein "sub" gab, aber jetzt macht es keinen Sinn. Wenn du das Statement in zwei Monaten oder Jahren noch mal bearbeitest, dann wird deine Reaktion auch nur ein "Hä?!? Wassollndas?" sein.
Die Aliase sind jetzt von innen nach außen "x", "y" und "final".
Auf jeden Fall vielen Dank für das spannende Thema!
Grüße
Biber
freut mich - ich begann schon zu zweifeln,
Noch als letzte Anmerkungen zu deinemr erweiterten Variante:
a) Aus meiner Sicht wird es aus Performance-Gründen vermutlich sinnvoller sein, das "WHERE Treffer-in-Fertigungsauftrag" nicht erst im äußersten SELECT ins Spiel zu bringen, sondern im innersten SELECT, dort wo die Arbeitsplandaten geholt werden. Also bevor da irgendwelche analytischen Funktionen drüberschrapeln.
b) die "agpos_id", die du als erste Spalte anzeigst, ist als Sortierkriteriun vielleicht sinnvoll, falls du noch ein ORDER BY drunterhängst.
Aber für den End-Benutzer ist es nur verwirrend. Kennt keiner, ist nur intern zur Verarbeitung im Statement erforderlich - nimm es raus aus der Resultset-Ausgabe.
c) ich habe mal das Statement bzgl. der WHERE-Bedingung umgestellt und dabei auch den Alias "main" ersetzt. "main" stammte ja aus einer Variante, als es auch noch ein "sub" gab, aber jetzt macht es keinen Sinn. Wenn du das Statement in zwei Monaten oder Jahren noch mal bearbeitest, dann wird deine Reaktion auch nur ein "Hä?!? Wassollndas?" sein.
Die Aliase sind jetzt von innen nach außen "x", "y" und "final".
SQL:
SELECT
agpos_id
, Aplidentnr
, aplnr
, kostst
, arbplatz
, station2 AS von_ag
, agpos AS bis_ag
, Anzahl
FROM (
SELECT y.*
, lead(y.station2, 1) OVER (PARTITION BY y.aplnr, y.station2 ORDER BY y.agpos_id) next_station2
, ROW_NUMBER() OVER (PARTITION BY y.aplnr, y.station2 ORDER BY y.aplidentnr, y.agpos) Anzahl
FROM (
SELECT x.*
, last_value(station) IGNORE NULLS OVER(partition BY aplnr ORDER BY aplnr, agpos) AS station2
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY aplnr ORDER BY aplidentnr, agpos) agpos_id
, ap.aplidentnr
, ap.aplnr
, ap.kostst
, ap.arbplatz
, ap.agpos
, CASE WHEN lag( aplidentnr||aplnr||kostst||arbplatz) OVER (ORDER BY aplnr, agpos ) = aplidentnr||aplnr||kostst||arbplatz
THEN NULL
ELSE agpos
END AS station
FROM DEMO.arbeitsplan ap
WHERE
aplnr IN
(SELECT aplnr
FROM DEMO.Fertigungsauftrag fa
WHERE
fa.fi_nr = '1'
AND fa.datneu >= sysdate-730
)
) x
) y
) final
WHERE
final.next_station2 IS NULL
-- ORDER BY...?? tbd
;
Auf jeden Fall vielen Dank für das spannende Thema!
Grüße
Biber
Zuletzt bearbeitet: