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