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

按应用分组查询最新记录的SQL语句问题求助

问题描述

我有如下样本数据:datetime与refresheddate为日期类型,runningtime为整数类型,其余字段为varchar类型。我需要按应用分组查询每个应用的最新记录,该数据库每10分钟更新一次。我使用的SQL查询语句如下:

SELECT log_history.* FROM log_history,(SELECT MAX(DATETIME) AS DATETIME, applications FROM log_history GROUP BY applications) max_test
    WHERE log_history.datetime = max_test.datetime AND
    log_history.applications = max_test.applications
    ORDER BY SERVER;

但执行后部分记录未显示,例如查询Server='1'的记录时仅得到56条结果,而执行SELECT DISTINCT app FROM log_history WHERE SERVER = '1';能得到90条结果。请问我的查询语句存在什么问题?

问题分析与解决

你的查询语句存在两个关键问题:

  • 分组字段与实际字段不匹配
    子查询中使用applications作为分组字段,但验证语句里用的是app,说明表中实际存储应用标识的字段是app而非applications。用错误的字段分组,会导致大量应用的最新记录无法被关联匹配,直接丢失结果。

  • 未处理同应用同时间多记录的场景
    数据库每10分钟批量更新,可能存在同一app在同一datetime下有多条记录的情况。原查询依赖datetime和错误字段的关联,若同时间有多条记录,可能因关联逻辑遗漏部分结果,或者因字段错误直接跳过整个应用的记录。

修正后的查询语句

方式一:使用窗口函数(推荐)

窗口函数可以精准为每个应用的记录按时间排序,直接取第一条最新记录,避免同时间多记录的问题:

WITH ranked_logs AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY app ORDER BY datetime DESC) AS rn
    FROM log_history
)
SELECT * FROM ranked_logs
WHERE rn = 1
ORDER BY SERVER;

方式二:使用子查询关联(兼容老版本数据库)

如果你的数据库不支持CTE(如MySQL 5.7及以前),可以修改子查询的分组字段为app后重新关联:

SELECT lh.*
FROM log_history lh
INNER JOIN (
    SELECT app, MAX(datetime) AS max_datetime
    FROM log_history
    GROUP BY app
) max_dates ON lh.app = max_dates.app AND lh.datetime = max_dates.max_datetime
ORDER BY lh.SERVER;

内容的提问来源于stack exchange,提问作者Rowlet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:17:15