我正試圖解決在工作中的趨勢問題,非常類似於下面的示例。我想我有一個方法,但不知道如何在SQL中完成它。Oracle SQL趨勢MTD數據
輸入數據是:
MTD LOC_ID RAINED
1-Apr-16 1 Y
1-Apr-16 2 N
1-May-16 1 N
1-May-16 2 N
1-Jun-16 1 N
1-Jun-16 2 N
1-Jul-16 1 Y
1-Jul-16 2 N
1-Aug-16 1 N
1-Aug-16 2 Y
所需的輸出是:
MTD LOC_ID RAINED TRENDS
1-Apr-16 1 Y New
1-May-16 1 N No Rain
1-Jun-16 1 N No Rain
1-Jul-16 1 Y Carryover
1-Aug-16 1 N No Rain
1-Apr-16 2 N No Rain
1-May-16 2 N No Rain
1-Jun-16 2 N No Rain
1-Jul-16 2 N No Rain
1-Aug-16 2 Y New
我試圖通過向的MTD上,以產生從所述輸入輸出,而不依賴於它。這樣,當新的月份添加到輸入時,輸出更改而不編輯查詢。
TRENDS的邏輯將出現在每個唯一的LOC_ID上。趨勢將有三個值:第一個月的「新」RAINED爲「Y」,隨後的任何月份的「結轉」爲RAYED爲「Y」,並且在RAINED爲「N」的任何月份爲「無雨」。
我想通過引入一個listagg的中間步驟來自動化這個問題。例如,對於LOC_ID =「1」:
MTD LOC_ID RAINED PREV_RAINED
1-Apr-16 1 Y (null)/0/(I don't care)
1-May-16 1 N Y
1-Jun-16 1 N Y;N
1-Jul-16 1 Y Y;N;N
1-Aug-16 1 N Y;N;N;Y
這種方式,產生輸出「趨勢」,我可以說:
case when RAINED = 'Y' then
case when not regexp_like(PREV_RAINED, 'Y', 'i') then
'New'
else
'Carryover'
end
else
'No Rain'
end as TRENDS
我的問題是,我不知道如何爲每個唯一的LOC_ID生成PREV_RAINED。我有一種感覺,它需要結合LAG()語句和按MTD的LOC_ID順序進行分區,但是我需要做的滯後數取決於每個月。
有沒有一種簡單的方法來產生PREV_RAINED或更簡單的方法來解決我的整體問題,同時保持每個月的自動化?
感謝您閱讀所有這些! :)
在這個例子中,loc_id = 2的趨勢是否正確? 5月下雨,4月不下雨,所以我預計5月份會有新消息。我錯了嗎? – Aleksej
什麼版本的Oracle?在12c中你可以使用MATCH_RECOGNIZE。 – mathguy
@Aleksej你是對的,但我在我的例子中混淆了輸入。我編輯它是正確的。 –