You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:58:57