假设你有这样的数据:
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中执行此操作或者我没有其他选择在代码级别手动执行此操作(因此,无需分组,只需获取数据并手动减去)。
答案 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
可让您获取下一小时的值,以便进行比较。
答案 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
答案 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`
如果您有大量数据,我会尝试重新考虑您的数据库结构,因为像这样的查询无法进行太多优化。