Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中按小时分组,但也包括小时+1中的第一个值_Mysql_Group By - Fatal编程技术网

在mysql中按小时分组,但也包括小时+1中的第一个值

在mysql中按小时分组,但也包括小时+1中的第一个值,mysql,group-by,Mysql,Group By,假设您有如下数据: time value 10:00 5 10:15 12 10:30 15 10:45 27 11:00 29 SELECT MAX(value) - MIN(value), HOUR(time) FROM mytable GROUP BY HOUR(time); 还有这样一个查询: time value 10:00 5 10:15 12 10:30 15 10:45 27 11:00

假设您有如下数据:

  time  value
  10:00   5
  10:15   12
  10:30   15
  10:45   27
  11:00   29
SELECT MAX(value) - MIN(value), HOUR(time) FROM mytable GROUP BY HOUR(time);
还有这样一个查询:

  time  value
  10:00   5
  10:15   12
  10:30   15
  10:45   27
  11:00   29
SELECT MAX(value) - MIN(value), HOUR(time) FROM mytable GROUP BY HOUR(time);
您将获得:

  value  time
    22    10
但是,我需要它包含11:00的值,因此结果是2429-5,而不是22。有没有一种方法可以在SQL中实现这一点,或者我除了在代码级别手动实现这一点之外别无选择,因此,在没有分组的情况下,只需获取数据并手动进行减法。

尝试:

SELECT hr, 
       max( value ) - min( value )
FROM mytable m
JOIN (
  SELECT  HOUR(`time`) hr, 
          cast(Date_Format(min(`time`),'%Y-%m-%d %H:00:00') as time) mt
  FROM mytable 
  GROUP BY HOUR(`time`)
) q
ON m.`time` >= q.mt 
AND m.`time` <= q.mt + interval 1 hour 
GROUP BY hr

演示:

根据数据的一致性,您可能可以通过自连接来实现这一点,如下所示:

SELECT HOUR(a.`time`) AS grouper,
GREATEST(MAX(a.value),IFNULL(MIN(b.value),0)) - MIN(a.value) AS diff
FROM mytable a
LEFT JOIN mytable b ON IF(HOUR(a.time) <= 23, HOUR(a.time)+1, 0) = HOUR(b.time)
GROUP BY grouper
同一个表上的左联接允许您获取下一个小时的值,以便进行比较


由于您希望11:00的值同时是HOUR=10和HOUR=11的一部分,因此我将使用以下UNION ALL查询:

SELECT `time`, MAX(value) - MIN(value)
FROM (
  SELECT
    HOUR(`time`) AS `time`, value
  FROM
    mytable

  UNION ALL

  SELECT
    CASE WHEN HOUR(`time`) > 0 THEN HOUR(`time`)-1 ELSE 23 END, value
  FROM
    mytable
  WHERE
    MINUTE(`time`)=0
) s
GROUP BY `time`

如果您有大量数据,我会尝试重新考虑您的数据库结构,因为像这样的查询无法进行太多优化。

您想同时包含10:00和11:00吗?只需删除group by子句。还需要包含10:00的值吗?@GordonLinoff:我无法删除group by,因为我需要每小时的结果。所以,我将得到当天所有时间的最大最小值结果。@PraveenPrasannan:是的,不过我对这会如何改变你的潜在答案感兴趣?如果包含10:00与不包含10:00,您能说明差异吗?只是为了验证,您希望11:00的数据点同时是10-11间隔和11-12间隔的一部分?谢谢您的回答。看来你的答案很完美,我会接受的。然而,当我将这个查询合并到更大的查询时,你能给我一个提示吗?这个查询看起来是这样的:我意识到在前面的示例中,我颠倒了错误的数据集,所以真正的数据集在这里。尽管如此,我仍然缺少一些获取数据的信息,因此任何帮助都将不胜感激。嗨,谢谢你的回答,但是12的值应该是1 34-33,而不是-33。你知道如何解决这个问题吗?是的,在diff上添加最大的方法,以便它使用下一个小时(如果存在),否则使用当前小时的最大值。请参阅上面更新的SQL和更新的fiddle。