MySQL选择一个日期范围,其中sum小于一个值
我有MySQL数据库和天气信息: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
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