如何通过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
相关产品推荐
相关产品推荐

