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

SQL按garazas_id排序并获取每组最新id记录的问题

问题分析与解决方案

你的SQL写法存在两个关键问题,导致返回了较早的记录:

  1. id列的错误写法:SELECT id = MAX(id)会被数据库解析为布尔判断(检查当前行的id是否等于分组内的最大id),而非将最大id赋值给id列,正确写法应为MAX(id) AS id。
  2. 非聚合列的不确定性: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:54:22