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

时间:2014-10-20 12:07:11

标签: 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);

你会得到:

  value  time
    22    10

但是,我需要它在11:00包含值,因此结果是24(29-5),而不是22.有没有办法在SQL中执行此操作或者我没有其他选择在代码级别手动执行此操作(因此,无需分组,只需获取数据并手动减去)。

3 个答案:

答案 0 :(得分:3)

根据您的数据的一致程度,您可以通过自我加入来执行此操作,如下所示:

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

同一张桌子上的LEFT JOIN可让您获取下一小时的值,以便进行比较。

http://sqlfiddle.com/#!9/fe72a/16

答案 1 :(得分:1)

尝试:

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

演示:http://sqlfiddle.com/#!9/012c7/9

答案 2 :(得分:0)

由于你希望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`

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