Oracle - Anzahl aufeinanderfolgender Datensätze

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".

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:
Moin warface,

bevor du diesen Beitrag nun auf erledigt setzt, eine hoffentlich letzte Korrektur.

Ich hatte geschrieben:

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.

Stimmt nicht ganz... wenn "Agpos_id" aus der Resultset-Anzeige rausfliegt, dann kann es auch ganz aus dem Statement raus.
D.h. die Zeile 19 mit dem "Mach mir ein ROW_NUMBER()" kann weg, in Zeile 12 kann die ORDER auf agpos statt agpos_id und gut.
Denn real ist diese künstliche Nummerierung gar nicht nötig in der Logik des Statements.
Und ganz am Ende des Statements beim noch fehlenden ORDER BY hast du genug Kriterien zur benutzergefälligen Sortierung.

Wir müssen es ja nicht komplexer macher als nötig - jedes Statement sollte auf einen Bierdeckel passen. ;-)

Schönes Wochenende
Biber
 
Zurück