SQL来标识初始状态,然后检查一个条件以保持该状态

SQL来标识初始状态,然后检查一个条件以保持该状态,sql,recursion,Sql,Recursion,我有一个问题让我难堪,我可以强迫它,但必须有一个更雄辩的方式 我们有4个雨量计,每分钟提供0.1毫米的雨量测量 触发点是在最近两个小时窗口的前15分钟内,任何单个雨量计的降雨量为0.5毫米。这很简单,只需在前面14行上求一个和就可以了。“警报”显示在SSRS仪表板上的控制室中 现在我被要求修改逻辑,这样一旦触发被激活,它将保持激活状态,直到至少2小时没有降雨记录。起初我觉得太容易了,但后来坐下来很快意识到,每次我们得到>=0.1毫米的雨水时,我需要延伸并检查另一个>=0.1毫米,直到有一个2小

我有一个问题让我难堪,我可以强迫它,但必须有一个更雄辩的方式

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

触发点是在最近两个小时窗口的前15分钟内,任何单个雨量计的降雨量为0.5毫米。这很简单,只需在前面14行上求一个和就可以了。“警报”显示在SSRS仪表板上的控制室中

现在我被要求修改逻辑,这样一旦触发被激活,它将保持激活状态,直到至少2小时没有降雨记录。起初我觉得太容易了,但后来坐下来很快意识到,每次我们得到>=0.1毫米的雨水时,我需要延伸并检查另一个>=0.1毫米,直到有一个2小时的无雨窗口

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

我相信我已经想得太多了,任何对方法论的帮助都会非常感激(事实上,只要把它打出来,我就想到了另一种使用lead的方法)


提前感谢

嗯。状态以15分钟间隔0.5毫米开始。一个州以两小时不下雨结束

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

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

(1) 请用您正在运行的数据库标记您的问题:oracle、sqlserver、mysql。。。?(2) 请以表格文本的形式向我们展示您想要的结果。(3) 到目前为止,您的查询是什么?它产生了哪些结果?谢谢Gordon,我针对数据库运行了它,并且完全确定了它。这是一个雄辩的回答,我让它变得比需要的困难得多。