sql - SQL 识别初始状态,然后检查条件以维持状态
问题描述
我有一个让我难过的问题,我可以强制它,但必须有一个更有说服力的方法。
我们有 4 个雨量计,每分钟提供 0.1 毫米的雨量测量。
触发点是在最近两个小时窗口内的前 15 分钟内任何单个雨量计的 0.5 毫米雨量。这很容易,只需将前面 14 行的总和相加即可。“警报”显示在 SSRS 仪表板上的控制室。
现在我被要求修改逻辑,以便一旦触发器被激活,它就会保持激活状态,直到至少 2 小时没有下雨记录。起初我认为太容易了,但坐下来很快意识到每次我们得到 >=0.1 毫米的雨,我需要扩展并检查另一个 >=0.1 毫米,直到有 2 小时的窗口没有下雨。
用另一种方式来解释。在 15 分钟内 >=0.5 将启动状态,然后在最后一个 2 小时内的任何 >0.1 将递归地保持状态激活。
我确信我在想这个,任何有关方法的帮助将不胜感激(实际上只是输入这个帮助我想到了另一种使用铅的方法)。
提前致谢
解决方案
嗯。. . 状态以 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
推荐阅读
- pdftron - 从 PDFTron 的注释中删除日期字段
- python - 从 csv 文件中删除行
- java - 无法在 Spring Boot 中实现 Drools KieSession Persistence
- python - 从函数中有效地填充数组
- apache-kafka - Confluent Replicator 错误:无法转换架构注册表记录 (io.confluent.connect.replicator.schemas.SchemaTranslator:188)
- javascript - 访问 URL 时的 Puppeteer 空白页面
- c# - 如何在线条下绘制对象?
- azure-devops - Azure DevOps SSH 任务在内联脚本选项中失败
- javascript - 如何将反应登录组件重构为现有的材料 ui 登录组件?
- testing - Laravel 8 - 使用“Date Mutators”和 Faker 的 PHPUnit 测试问题