我正在使用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个下雨期。 任何帮助我更接近答案的人都将不胜感激!
答案 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;
答案 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表达式。
条件和仅在条件为真时求和。