SQL按garazas_id排序并获取每组最新id记录的问题
问题分析与解决方案
你的SQL写法存在两个关键问题,导致返回了较早的记录:
- id列的错误写法:
SELECT id = MAX(id)会被数据库解析为布尔判断(检查当前行的id是否等于分组内的最大id),而非将最大id赋值给id列,正确写法应为MAX(id) AS id。 - 非聚合列的不确定性:GROUP BY仅指定
garazas_id,但sk_rad和datums未使用聚合函数,数据库会返回分组内任意一行的对应值,无法保证是最大id对应的那一行数据。
以下是几种可靠的解决方案:
方案1:窗口函数ROW_NUMBER()(推荐,兼容性好)
通过窗口函数为每个用户的记录按id降序排名,筛选排名第一的记录:
WITH ranked_records AS ( SELECT id, garazas_id, sk_rad, datums, ROW_NUMBER() OVER (PARTITION BY garazas_id ORDER BY id DESC) AS rn FROM `elektr_apmaks` ) SELECT id, garazas_id, sk_rad, datums FROM ranked_records WHERE rn = 1 ORDER BY garazas_id + 0;
方案2:子查询关联最大id
先获取每个用户的最大id,再关联原表拿到完整记录:
SELECT e.id, e.garazas_id, e.sk_rad, e.datums FROM `elektr_apmaks` e INNER JOIN ( SELECT garazas_id, MAX(id) AS max_id FROM `elektr_apmaks` GROUP BY garazas_id ) m ON e.garazas_id = m.garazas_id AND e.id = m.max_id ORDER BY garazas_id + 0;
方案3:FETCH FIRST WITH TIES(部分数据库支持)
如果你的数据库支持SQL:2008标准的FETCH FIRST WITH TIES(如SQL Server、PostgreSQL),可以用更简洁的写法:
SELECT id, garazas_id, sk_rad, datums FROM `elektr_apmaks` ORDER BY garazas_id + 0, id DESC FETCH FIRST 1 ROW WITH TIES;
内容的提问来源于stack exchange,提问作者Ervins Grikis
相关产品推荐
相关产品推荐

