我正在尝试解决与以下示例非常相似的工作趋势问题。我想我有一个方法,但不知道如何在 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 的趋势从输入中产生输出。这样,当新的月份被添加到输入中时,输出会改变而无需编辑查询。
TRENDS 的逻辑将出现在每个唯一的 LOC_ID 上。趋势将具有三个值:第一个月 RAINED 为“Y”的“新”,RAINED 为“Y”的任何后续月份的“Carryover”,以及 RAINED 为“N”的任何月份的“No Rain”。
我想通过引入一个带有 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 或更简单的方法来解决我的整体问题,同时保持每个月的自动化?
感谢您阅读所有这些!:)