【问题标题】:SQL set TRUE if 5+ or more consecutive hours with values below 0如果 5+ 或更多连续小时且值低于 0,则 SQL 设置为 TRUE
【发布时间】:2021-10-31 16:08:13
【问题描述】:

我想通过相应地设置一个值 (FiveConse) 来检查给定值是否低于 0 的连续 5 小时以上。如下表所示

Time Value FiveConse
12:00 1 False
13:00 -1 True
14:00 -3 True
15:00 -4 True
16:00 -5 True
17:00 -6 True
18:00 -5 True
19:00 7 False
20:00 7 False

目前我正在使用多个滞后/领先来查看每个值和连续值。但是,这似乎不是很有效。

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: mysql sql lag lead


【解决方案1】:
WITH cte AS (
    SELECT `Time`, Value, 
           ROW_NUMBER() OVER (ORDER BY `Time`) - ROW_NUMBER() OVER (PARTITION BY Value < 0 ORDER BY `Time`) grp
    FROM test
)
SELECT `Time`, 
       Value,
       COUNT(*) OVER (PARTITION BY grp) >= 5 FiveConsecutive
FROM cte
ORDER BY `Time`;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7476b715df0c69ac46736138366eec85

【讨论】:

    【解决方案2】:

    您可以简单地将lead() 与一些条件逻辑一起使用:

    select t.*
    from (select t.*,
                 lead(time, 4) over (order by time) as time_4,
                 lead(time, 4) over (partition by (value < 0) order by time) as time_4_neg
          from t
         ) t
    where time_4 = time_4_neg;
    

    这会将前四行的时间值与前四行的时间值进行比较以获得负值。如果它们相同,则您连续有五个底片。

    您实际上可以使用一个窗口函数来做到这一点:

    select t.*
    from (select t.*,
                 sum( (value < 0) ) over (order by time rows between current row and 4 rows following) as cnt_neg_5
          from t
         ) t
    where cnt_neg_5 = 5;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2020-11-07
      • 1970-01-01
      • 2016-10-20
      • 2019-08-11
      相关资源
      最近更新 更多