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

如何更简便地按唯一ID获取最新记录?求优化方案

按唯一ID获取最新记录的简便方案

方法1:简化窗口函数写法(替代CTE)

不用CTE,直接用子查询嵌套窗口函数,语法更紧凑:

SELECT *
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY unique_id ORDER BY date DESC) AS rn
    FROM your_table
) t
WHERE rn = 1;

如果同一unique_id存在多条日期相同的最新记录,把ROW_NUMBER()换成RANK()即可保留所有符合条件的记录。

方法2:关联子查询获取最新记录

先分组拿到每个unique_id的最新日期,再关联原表匹配完整记录,完美避开“分组所有字段”的问题:

SELECT t.*
FROM your_table t
INNER JOIN (
    SELECT unique_id, MAX(date) AS latest_date
    FROM your_table
    GROUP BY unique_id
) latest 
ON t.unique_id = latest.unique_id AND t.date = latest.latest_date;

方法3:数据库专属简化语法(PostgreSQL)

PostgreSQL支持DISTINCT ON语法,一行就能实现需求:

SELECT DISTINCT ON (unique_id) *
FROM your_table
ORDER BY unique_id, date DESC;

逻辑是按unique_id分组,每组内按date倒序排序,直接取第一条记录。


为什么你同事的方法无效?

GROUP BY unique_id后,多数数据库(如开启ONLY_FULL_GROUP_BY的MySQL、PostgreSQL)要求SELECT中的非聚合字段必须包含在GROUP BY里。直接加HAVING date = MAX(date)是错误的——date是单条记录的字段,而MAX(date)是分组后的聚合值,两者无法直接比较。必须先通过子查询拿到每个分组的最新日期,再关联原表获取完整记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:24:10