条件值> 10 的 Mysql 查询,连续日期时间为 3 小时

标签 mysql sql

考虑一个带有 id、date datetime、value double 的表,我每分钟都有数据在表中。

我正在尝试使用 mysql 连续 3 个多小时识别值 > 10 的“事件”。

当时我正在使用查询:

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 之间有一个“事件”。

最佳答案

在 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
;

这里使用的四个变量中的三个仅仅是脚本参数,只有一个,@startdate,实际上在查询中被赋值和检查。

基本上,查询遍历行,标记那些值大于特定最小值 (@minvalue) 的行,最终生成一个时间范围列表,在此期间值与条件匹配。实际上,为了正确计算结束边界,紧跟在匹配行之后的非匹配行也包含在相应的组中。因此,向原始数据集添加了一个额外的行,其中 Date 是根据最新的 Date 加上指定的 @granularity 计算得出的表中的时间戳和 Value 只是 @minvalue

一旦获得,范围列表将被连接回原始表以检索落在范围边界之间的详细行,范围不够长(由 @minduration 指定) >) 一路被过滤掉。

如果您运行此解决方案 on SQL Fiddle ,您将看到以下输出:

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

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

关于条件值> 10 的 Mysql 查询,连续日期时间为 3 小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10614854/

相关文章:

php - 通过一个其他表中的字段从表中选择行

php - 内连接和回显解决方案

sql - 使用 SQL Server 对会计年度进行分组

MySQL 3 列唯一约束不起作用,可能是由于 NULL

Mysql 与未知列匹配

php - pdo 准备插入失败

php - 根据登录用户过滤数据库值

php - WordPress 从主机迁移到本地服务器

php - 仅在距离上次相等插入已经过去 5 分钟时才插入?

sql - 将整数截断为特定位数?