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

如何通过GROUP BY语句查询每个分组的最后一条记录

GROUP BY查询每个分组最后一条记录解决方案

原写法问题说明

你当前的写法利用了MySQL低版本对非标准SQL的兼容特性,GROUP BY默认返回每个分组的第一条匹配记录,单独使用MAX(ticket_id)仅能拿到分组内的最大ID值,无法自动关联该ID对应的其他字段内容,因此无法得到预期的最后一条完整记录。

兼容全版本数据库的实现方案

通过子查询先拿到每个分组的最大ID,再关联原表匹配完整行数据:

SELECT t.ticket_id, t.unique_id, t.subject, t.date, t.time,
       t.category, t.message, t.signature, t.status, t.username, t.screenshot 
FROM ticket t
INNER JOIN (
    -- 先获取每个unique_id分组对应的最大ticket_id(自增ID最大值即最新记录)
    SELECT unique_id, MAX(ticket_id) AS max_ticket_id
    FROM ticket
    GROUP BY unique_id
) t_max 
ON t.unique_id = t_max.unique_id 
AND t.ticket_id = t_max.max_ticket_id

支持窗口函数的数据库(MySQL8.0+、PostgreSQL等)更简洁的方案

使用ROW_NUMBER()窗口函数给分组内行排序后过滤:

SELECT * FROM (
    SELECT 
        ticket_id, unique_id, subject, date, time,
        category, message, signature, status, username, screenshot,
        -- 按unique_id分组,组内按ticket_id倒序排序,排序为1的就是最新记录
        ROW_NUMBER() OVER (PARTITION BY unique_id ORDER BY ticket_id DESC) AS rn
    FROM ticket
) t
WHERE rn = 1

注意事项

  • 如果你判断最新记录的依据不是自增ID,而是创建时间,可以将ORDER BY后的ticket_id DESC替换为对应的时间字段排序规则即可。
  • 不建议在GROUP BY语句中直接查询非分组、非聚合的字段,该写法不符合SQL标准,除MySQL低版本外的数据库都会直接报错,返回结果也不可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 03:06:00