我试图解决工作中的趋势问题,与以下示例非常相似。我想我有一种方法,但是不知道如何在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”的第一个月内,“新”为“ 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
这样,在输出中产生“趋势”,我可以说:
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()语句和按LOC_ID顺序按MTD组合起来,但是我需要做的滞后次数取决于每个月。
有没有一种简单的方法可以产生PREV_RAINED,或者有一种更简单的方法来解决我的总体问题,同时又每月保留自动化?
感谢您阅读所有这些内容!:)
在下面的SQL中,分为两个部分。
(i) Calculating the ROWNUMBER value for rained attribute at loc_id,rained level.
(ii) Get the count at partition level loc_id,rained.
通过计算以上两个,我们可以编写CASE WHEN逻辑来根据您的需求计算趋势。
SELECT mtd,
loc_id,
rained,
CASE WHEN rained = 'N' THEN 'No Rain'
WHEN rained = 'Y' AND rn = 1 THEN 'New'
ELSE 'Carry Over'
END AS Trends
FROM
(
SELECT mtd,
loc_id,
rained,
ROW_NUMBER() OVER ( PARTITION BY loc_id,rained ORDER BY mtd ) AS rn,
COUNT(*) OVER ( PARTITION BY loc_id,rained ) AS count_locid_rained
FROM INPUT
ORDER BY loc_id,mtd,rained,rn
) X;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句