2 回答

TA貢獻1921條經驗 獲得超9個贊
Oracle 思路:
1、使用lag()進行行間比較,使用flag標識,相同置零,不同置1
2、使用sum(flag),標識區間
3、使用max(date),獲取時間區間
注:先理解窗口函數
參考SQL Cookbook 章節:10.3

TA貢獻1911條經驗 獲得超7個贊
給你個思路:
1、按照品類,日期排序,2、對排完序的數據進行標號處理,當品類或者價格發生變動時,標號+1,3、然后按照品類,價格和標號進行分組,獲取最小日期和最大日期就是你的價格波動區間
思路就是這樣,這里有個mysql版本的sql,你自己改成Oracle版本即可,或者Oracle可能有更高級的現成的功能可以用,我就不清楚了:
select ITEM, PRICE,min(IN_DATE) start_date,max(IN_DATE) end_date
from (
select
@gn:=case when @ITEM<>ITEM or @PRICE<>PRICE then @gn+1 else @gn end gn,
@ITEM:=ITEM ITEM,
@PRICE:=PRICE PRICE,
IN_DATE
from
(select ITEM,PRICE,IN_DATE
from PUR_ODRER
order by ITEM, IN_DATE) a,
(select @gn:=0) b
) aa
group by ITEM, PRICE,gn
order by gn;
- 2 回答
- 0 關注
- 965 瀏覽
添加回答
舉報