如何修改MySQL查询以同时返回最近1小时的极值及对应时间?
嘿西蒙,我来帮你搞定这个MySQL查询的修改需求!不管你想要把最大/最小值信息放在一行还是分两行展示,这里有几种实用的方案供你选择:
方案1:分两行返回最大值、最小值及对应时间
这种方式结果清晰直观,每行对应一组极值信息,用UNION ALL把两个单独的极值查询合并起来:
SELECT '最大值' AS 类型, value AS 数值, occurrence_time AS 出现时间 FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value DESC LIMIT 1 UNION ALL SELECT '最小值' AS 类型, value AS 数值, occurrence_time AS 出现时间 FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value ASC LIMIT 1;
方案2:单行返回所有极值信息
如果需要把所有结果整合在一行(方便后续报表或程序处理),可以用子查询分别获取每个极值和对应时间:
SELECT (SELECT value FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value DESC LIMIT 1) AS 最大值, (SELECT occurrence_time FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value DESC LIMIT 1) AS 最大值出现时间, (SELECT value FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value ASC LIMIT 1) AS 最小值, (SELECT occurrence_time FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ORDER BY value ASC LIMIT 1) AS 最小值出现时间;
方案3:用窗口函数优化性能(适合大数据量)
如果你的表数据量较大,前两种方案会扫描两次表,用窗口函数可以只扫描一次数据,效率更高:
WITH 最近一小时数据 AS ( SELECT value, occurrence_time, ROW_NUMBER() OVER (ORDER BY value DESC) AS 最大值排名, ROW_NUMBER() OVER (ORDER BY value ASC) AS 最小值排名 FROM your_table WHERE occurrence_time >= NOW() - INTERVAL 1 HOUR ) SELECT MAX(CASE WHEN 最大值排名 = 1 THEN value END) AS 最大值, MAX(CASE WHEN 最大值排名 = 1 THEN occurrence_time END) AS 最大值出现时间, MAX(CASE WHEN 最小值排名 = 1 THEN value END) AS 最小值, MAX(CASE WHEN 最小值排名 = 1 THEN occurrence_time END) AS 最小值出现时间 FROM 最近一小时数据;
记得把上面代码里的your_table换成你实际的表名,value和occurrence_time替换成你表中对应的数值字段和时间字段哦!
内容的提问来源于stack exchange,提问作者Simon Markham
相关产品推荐
相关产品推荐

