我正在按照评论者的建议改写我以前的问题。查找无序列表中最长的有序列表
下面的集合表示产品连续几周的销售额。
22,19,20,23,16,14,15,15,18,21,24,10,17
我需要找到更高的销售数字在连续两周的最长的,即周6周11 14,15,15,18,21,24
表示。
我有一个查询返回结果,但想知道如何改进它。任何人都可以建议一些方法来做到这一点?提前致谢。
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)
;
你为什么把它作为一个逗号分隔的字符串,而不是在[收藏](HTTPS ://docs.oracle.com/cd/B28359_01/appdev.111/b28370/collections.htm#LNPLS005)? – MT0