Mysql查询,条件值大于10,连续日期周期为3小时

Mysql查询,条件值大于10,连续日期周期为3小时,mysql,sql,Mysql,Sql,考虑一个id为date datetime、值为double的表,我每分钟都有数据 我尝试使用mysql来识别值连续大于10超过3小时的事件 在我使用查询时: select date from table where value > 10; 然后我手动读取日期的连续位置 事件示例: Date - value 2000/01/01 00:00 - 5 2000/01/01 01:00 - 5 2000/01/01 02:00 - 5 2000/01/01 03:00

考虑一个id为date datetime、值为double的表,我每分钟都有数据

我尝试使用mysql来识别值连续大于10超过3小时的事件

在我使用查询时:

select date from table where value > 10;
然后我手动读取日期的连续位置

事件示例:

Date             - value
2000/01/01 00:00 - 5
2000/01/01 01:00 - 5
2000/01/01 02:00 - 5
2000/01/01 03:00 - 11
2000/01/01 04:00 - 11
2000/01/01 05:00 - 11
2000/01/01 06:00 - 5
2000/01/01 07:00 - 5
2000/01/01 08:00 - 5
2000/01/01 09:00 - 11
2000/01/01 10:00 - 11
2000/01/01 11:00 - 5
在这种情况下,03:00和05:00之间有一个事件

select count(*) from table where DATE_SUB(CURDATE(),INTERVAL 3 HOUR) < `date`

select count(*) from table where DATE_SUB(CURDATE(),INTERVAL 3 HOUR) < `date` AND `value` > 10
然后比较结果,如果不相同,则不连续。

胡乱猜测:

select * from 
    (select event, MAX(date) as date from table where value > 10 group by event) maxs
inner join 
    (select event, MIN(date) as date from table where value > 10 group by event) mins
on maxs.event = mins.event
where (time_to_sec(timediff(maxes.date, mins.date)) / 3600) > 3

在MySQL中,您可以在检索数据时在SELECT语句中分配变量。此功能有助于解决许多通常使用MySQL没有的窗口功能的问题。它也可以帮助你。以下是我最终得出的解决方案:

SET @startdate = CAST(NULL AS datetime);
SET @granularity = 60;   /* minutes */
SET @minduration = 180;  /* minutes */
SET @minvalue = 10;

SELECT
  t.Date,
  t.Value
FROM (
  SELECT
    StartDate,
    MAX(Date) AS EndDate
  FROM (
    SELECT
      Date,
      Value,
      CASE
        WHEN Value > @minvalue OR @startdate IS NOT NULL
        THEN IFNULL(@startdate, Date)
      END AS StartDate,
      @startdate := CASE
        WHEN Value > @minvalue
        THEN IFNULL(@startdate, Date)
      END AS s
    FROM (
      SELECT Date, Value FROM YourTable
      UNION ALL
      SELECT MAX(Date) + INTERVAL @granularity MINUTE, @minvalue FROM YourTable
    ) s
    ORDER BY Date
  ) s
  WHERE StartDate IS NOT NULL
  GROUP BY StartDate
) s
  INNER JOIN YourTable t ON t.Date >= s.StartDate AND t.Date < s.EndDate
WHERE s.EndDate >= s.StartDate + INTERVAL @minduration MINUTE
;

据我所知,这正是您所期望的。

如果一项活动在10小时以下,然后在4小时内超过10次,然后在6小时内低于10次,那么就我所知,结果应该表明该活动在4小时内超过10次。谢谢您的建议!考虑一个类似的例子:日期-值2000 / 01 / 01 00 00 - 5 / 2000 / 01 / 01 01:00 - 5 / 2000 / 01 / 01 02:00 - 5 /y/03/-04/-04/-y0/y05:00 -O/06/O-06:00 -O/07/-O07/-O07/-O08/-O08:00 -O/09/-O09/-O/10/-10/-10/-O/11/-11:00–一个事件持续三个小时。在这种情况下,MAXdate将返回2000/01/01 10:00,而MINdate将返回2000/01/01 03:00。当我做了进一步的调查后,我会再次发布。谢谢如果你觉得这个问题描述得不好,我很抱歉。表中有几年的卫星数据,每分钟都有数据。我有mysql表中的所有数据,我想确定一些事件,例如,磁场强度在连续一段时间内超过某个值。在空间物理学中,这些周期通常被解释为太阳风中的磁云。数据有规律吗?可以省略分钟吗?很好的解决方案!谢谢你的解释!非常感谢这里有一个简化:选择开始,从选择日期开始最大结束,如果值>10,IF@start为空,@start:=date,@start,@start:=NULL start,从t开始到日期结束,按日期a排序,其中开始不为空,结束间隔2小时>=按开始分组;我的简化过于简单:在选择之前需要SET@start:=NULL,否则查询只会在第二次运行时传递结果。
DATE                            VALUE
------------------------------  -----
January, 01 2000 03:00:00-0800  11
January, 01 2000 04:00:00-0800  11
January, 01 2000 05:00:00-0800  11