MySQL选择一个日期范围,其中sum小于一个值

MySQL选择一个日期范围,其中sum小于一个值,mysql,Mysql,我有MySQL数据库和天气信息: Date | Rain 2001-01-01 | 0.0 2001-01-02 | 0.2 2001-01-03 | 0.0 此表包含近20年的数据。每天一张唱片 我想从数据库中获取所有干旱期。定义:至少20天内降雨量小于0.5毫米 我可以用PHP做一个循环,迭代所有数据,计算过去20天的总和。但我想知道这是否可以在MySQL语句中实现 更复杂的是,我还需要干旱期的持续时间,以天为单位 因此,如果干旱期从2020-04-01开始到2020-04-2

我有MySQL数据库和天气信息:

Date       | Rain
2001-01-01 | 0.0
2001-01-02 | 0.2
2001-01-03 | 0.0
此表包含近20年的数据。每天一张唱片

我想从数据库中获取所有干旱期。定义:至少20天内降雨量小于0.5毫米

我可以用PHP做一个循环,迭代所有数据,计算过去20天的总和。但我想知道这是否可以在MySQL语句中实现

更复杂的是,我还需要干旱期的持续时间,以天为单位

因此,如果干旱期从2020-04-01开始到2020-04-25结束,那么我想要的是总降雨量小于0.5mm,持续时间为25天。理论上,在这种情况下,从2020-04-02到2020-04-21有一个干旱期,但这是在另一个时期内。所以我只想要最长的时间

在MySQL中实现这一点的最佳方法是什么

MySQL版本:5.5.31

用于创建包含数据的表的查询:

CREATE TABLE `dayRecords` (
  `Date` date NOT NULL,
  `Rain` decimal(10,1) DEFAULT NULL
) ENGINE=MyISAM;

INSERT INTO `dayRecords` (`Date`, `Rain`) VALUES
('2020-03-10', '11.0'),
('2020-03-11', '10.8'),
('2020-03-12', '2.2'),
('2020-03-13', '1.8'),
('2020-03-14', '0.0'),
('2020-03-15', '0.0'),
('2020-03-16', '0.0'),
('2020-03-17', '0.0'),
('2020-03-18', '0.0'),
('2020-03-19', '0.0'),
('2020-03-20', '0.0'),
('2020-03-21', '0.2'),
('2020-03-22', '0.0'),
('2020-03-23', '0.0'),
('2020-03-24', '0.0'),
('2020-03-25', '0.0'),
('2020-03-26', '0.0'),
('2020-03-27', '0.0'),
('2020-03-28', '0.0'),
('2020-03-29', '0.0'),
('2020-03-30', '0.0'),
('2020-03-31', '0.0'),
('2020-04-01', '0.2'),
('2020-04-02', '0.0'),
('2020-04-03', '0.0'),
('2020-04-04', '0.0'),
('2020-04-05', '0.0'),
('2020-04-06', '0.0'),
('2020-04-07', '0.0'),
('2020-04-08', '0.0'),
('2020-04-09', '0.2');

ALTER TABLE `dayRecords`
  ADD PRIMARY KEY (`Date`);
预期结果:

start      | end        | total | duration
2020-03-14 | 2020-04-08 | 0.4   | 26

我的最终结果和你的略有不同。 因为我也有09.04,但我也有连续26天的恢复

SELECT 
    MIN(`Date`) start,
    MAX(`Date`) end,
    ROUND(MAX(total_rain),1) total,
    SUM(isdRoud=1) duration
FROM
    (SELECT 
        `Date`,

            IF( `Rain` > 0.5, IF(@droud = 3,@droud := 3,@droud := 2), @droud := 1) isdRoud,
            IF (`Rain` > 0.5 AND @droud  = 2, @cat:= @cat + 1, @cat:= @cat) categorie,
            IF(@droud = 2,@droud := 3,@droud := @droud) nextrain,
            IF (@droud  = 3 OR @droud  = 2, @rain:= 0, @rain:= @rain) resetrain,
            IF(@droud = 1,@rain:=@rain + `Rain`,@rain:=@rain) total_rain
    FROM
        (SELECT 
        *
    FROM
        `dayRecords`
    ORDER BY `Date` DESC) t1
     , (SELECT @rain:=0.0) t2 
     , (SELECT @droud:=1) t3
     , (SELECT @cat:=0) t4) t5
WHERE
    isdroud = 1
GROUP BY categorie
HAVING duration >= 20;

dbfiddle

指定MySQl版本。将表定义添加为“创建表”,将样本数据集添加为“插入”,并为此数据集添加所需输出。“定义:20天内降雨量小于0.5毫米”-可能应该是“定义:至少20天内降雨量小于0.5毫米”我添加了数据,是的,至少20天是正确的。谢谢您的评论。这些问题看起来很有希望。但天数/持续时间的计数并没有停止。从2003年10月1日开始,我尝试在一个完整的数据集上进行查询。这就是结果:开始日期enddate | total | duration 2003-10-02 | 2020-04-09 | 10736.8 | 3705这是因为我在查询中添加了一个拼写错误:您还必须将其更改为duration>=20;或者你看不到任何数据。你的droud正好有20天的时间,这比你开始的问题要长得多。看,这很容易解决,困难的部分是正确理解逻辑。看 start | end | total | duration :--------- | :--------- | ----: | -------: 2020-03-21 | 2020-04-09 | 0.4 | 20 2019-04-04 | 2019-04-23 | 0.2 | 20