Oracle SQL趋势MTD数据

瑞安·巴克(Ryan Barker)

我试图解决工作中的趋势问题,与以下示例非常相似。我想我有一种方法,但是不知道如何在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章