SQL查询 - 找出行从0更改为另一个值的次数

时间:2018-06-09 21:33:06

标签: mysql

我正在使用MySQL 8并需要创建存储过程

我有一个包含DATE字段和值字段的表,该字段可以是0或任何其他数字。该值字段表示当天的每日降雨量。 该表存储了今天和10年之间的数据。

我需要知道未来10年会有多少次降雨。

因此,例如,如果我的表包含以下数据:

Date          - Value
2018-06-09    -   0
2018-06-10    -  50
2018-06-11    -   0
2018-06-12    -  15
2018-06-13    -  17
2018-06-14    -   0
2018-06-15    -   0
2018-06-16    -  12
2018-06-17    - 123
2018-06-18   -   17

然后SP应该返回3,因为有3个下雨期。 任何帮助我更接近答案的人都将不胜感激!

2 个答案:

答案 0 :(得分:2)

使用MySQL join

SELECT COUNT(*) Number_of_Periods
FROM yourTable A JOIN yourTable B
ON DATE(A.`DATE`)=DATE(B.`DATE` - INTERVAL 1 DAY)
AND A.`VALUE`=0 AND B.`VALUE`>0;

请参阅Demo on DB Fiddle

答案 1 :(得分:2)

您无需为此创建存储过程。
使用MySQL的8.0 LEAD功能的解决方案支持带有间隙的日期。
需要扫描完整的表格,但我不认为~3560记录存在巨大问题。

<强>查询

SELECT 
  SUM(filter_match = 1) AS number
FROM (
  SELECT 
    ((t.value = 0) AND (LEAD(t.value) OVER (ORDER BY t.date ASC) != 0)) AS filter_match
  FROM
   t
) t

参见演示https://www.db-fiddle.com/f/sev4NqgLsFPgtNgwzruwy/2

  

顺便说一句,你介意扩大你的答案,了解如何   LEAD和SUM一起工作?

LEAD(t.value) OVER (ORDER BY t.date ASC)只是意味着从按日期排序的下一条记录中获取下一个值。

这个演示很好地展示了https://www.db-fiddle.com/f/sev4NqgLsFPgtNgwzruwy/6

SUM(filter_match = 1)是条件总和。在这种情况下,别名filter_match必须为true。

查看filter_match是示例https://www.db-fiddle.com/f/sev4NqgLsFPgtNgwzruwy/8

在MySQL中,聚合函数可以有一个类似1 = 1(总是为1或1)或1 = 0(总是为0或0)的SQL表达式。 条件和仅在条件为真时求和。

参见演示https://www.db-fiddle.com/f/sev4NqgLsFPgtNgwzruwy/7