Ich formuliere meine vorherige Frage neu, wie von einem Kommentator vorgeschlagen.Die längste geordnete Liste innerhalb einer ungeordneten Liste finden
Das folgende Set repräsentiert den Verkauf eines Produkts in aufeinanderfolgenden Wochen.
22,19,20,23,16,14,15,15,18,21,24,10,17
Ich brauche die längste Abfahrt der höheren Verkaufszahlen in aufeinander folgenden Wochen zu finden, das heißt Wochen 6 bis Woche-11 durch 14,15,15,18,21,24
vertreten.
Ich habe eine Abfrage, die das Ergebnis zurückgibt, aber möchte die Methoden kennen, um es zu verbessern. Kann mir jemand bitte etwas vorschlagen? Danke im Voraus.
with
raw_data (sales) as
(
select '22,19,20,23,16,14,15,15,18,21,24,10,17' from dual
)
,
derived_tbl(week, sales) as
(
select level, regexp_substr(sales, '([[:digit:]]+)(,|$)', 1, level, null, 1)
from raw_data connect by level <= regexp_count(sales,',')+1
)
,
coll(week, sales, salesdlag, salesdlead) as
(
select week, sales,
nvl(sales - (lag(sales) over (order by week)), 0),
nvl((lead(sales) over (order by week) - sales), 0)
from derived_tbl
)
,
filt_coll(week, sales, salesdlag, salesdlead) as
(
select week, sales, salesdlag, salesdlead
from coll
where not (salesdlag < 0 and salesdlead < 0)
)
,
cte(startweek, sales, salesdlag, salesdlead, actualweek) as
(
select week, sales, salesdlag, salesdlead, week from filt_coll
union all
select cte.startweek, cl.sales, cl.salesdlag, cl.salesdlead, cl.week
from filt_coll cl, cte
where cl.week = cte.actualweek + 1 and cl.sales >= cte.sales
)
,
pen_coll as
(
select * from cte order by startweek,actualweek
)
,
final_coll as
(
select startweek, actualweek, sales, count(startweek) over(PARTITION BY startweek) as cnt from pen_coll
)
select LISTAGG(sales, ',') within group (order by null) as rslt
from final_coll
where cnt = (select max(cnt) from final_coll)
;
Warum sind Sie es als eine durch Kommas getrennte Zeichenfolge und nicht in einer [Sammlung] Speichern (https : //docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#LNPLS005)? – MT0