以下の例と非常によく似た、職場でのトレンドの問題を解決しようとしています。メソッドはあると思いますが、SQL でそれを行う方法がわかりません。
入力データは次のとおりです。
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 に依存せずに、MTD の傾向を調べて、入力から出力を生成しようとしています。このようにして、新しい月が入力に追加されると、クエリを編集せずに出力が変更されます。
TRENDS のロジックは、一意の LOC_ID ごとに発生します。トレンドには 3 つの値があります。RAINED が「Y」の最初の月の「新規」、RAINED が「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
このようにして、出力に「TRENDS」を生成するには、次のように言えます。
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 を生成する簡単な方法、または毎月の自動化を維持しながら全体的な問題を解決する簡単な方法はありますか?
これをすべて読んでくれてありがとう!:)