首页 > 解决方案 > SQL 识别初始状态,然后检查条件以维持状态

问题描述

我有一个让我难过的问题,我可以强制它,但必须有一个更有说服力的方法。

我们有 4 个雨量计,每分钟提供 0.1 毫米的雨量测量。

在此处输入图像描述

触发点是在最近两个小时窗口内的前 15 分钟内任何单个雨量计的 0.5 毫米雨量。这很容易,只需将前面 14 行的总和相加即可。“警报”显示在 SSRS 仪表板上的控制室。

现在我被要求修改逻辑,以便一旦触发器被激活,它就会保持激活状态,直到至少 2 小时没有下雨记录。起初我认为太容易了,但坐下来很快意识到每次我们得到 >=0.1 毫米的雨,我需要扩展并检查另一个 >=0.1 毫米,直到有 2 小时的窗口没有下雨。

用另一种方式来解释。在 15 分钟内 >=0.5 将启动状态,然后在最后一个 2 小时内的任何 >0.1 将递归地保持状态激活。

我确信我在想这个,任何有关方法的帮助将不胜感激(实际上只是输入这个帮助我想到了另一种使用铅的方法)。

提前致谢

标签: sqlrecursion

解决方案


嗯。. . 状态以 15 分钟间隔开始 0.5 毫米。一个州以 2 小时无雨结束。

我们可以使用窗口函数计算开始和停止标志:

select t.*,
       (case when sum(site1rain1min) over (order by datetimestamp rows between 14 preceding and current row) >= 0.5
             then 1 else 0
        end) as startflag,
       (case when sum(site1rain1min) over (order by datetimestamp rows between 119 preceding and current row) = 0
             then 1 else 0
        end) as endflag
from t;

然后,为此,我们要识别其最近的标志是开始标志的每一行。那表示状态。这是想法:

select t.*,
       (case when max(case when startflag = 1 then datetimestamp end) over (order by datetimestamp) >
                  max(case when endflag = 1 then datetimestamp end) over (order by datetimestamp)
             then 1 else 0
        end) as is_reporting_period
from (select t.*,
             (case when sum(site1rain1min) over (order by datetimestamp rows between 14 preceding and current row) >= 0.5
                   then 1 else 0
              end) as startflag,
             (case when sum(site1rain1min) over (order by datetimestamp rows between 119 preceding and current row) = 0
                   then 1 else 0
              end) as endflag
      from t
     ) t

推荐阅读