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

如何为每个唯一uid获取最新unixdate对应的SQL查询结果

解决每个UID仅返回最新条目的SQL查询问题

我来帮你搞定这个问题!你之前用SELECT * FROM demo GROUP BY uid ORDER BY unixdate DESC没得到正确结果,核心原因是GROUP BY的设计是做聚合计算,直接选取非聚合列(比如cid)是不可靠的——数据库不会自动帮你关联到对应最大unixdate的那一行,甚至在严格模式下这种写法会直接报错。

下面给你两种通用且可靠的解决方案,适配绝大多数数据库:

方法1:子查询+关联(兼容所有数据库)

这个思路是先找出每个uid对应的最大unixdate,再通过关联原表拿到完整的行数据:

SELECT d.*
FROM demo d
INNER JOIN (
    -- 先获取每个uid的最新unixdate
    SELECT uid, MAX(unixdate) AS max_unixdate
    FROM demo
    GROUP BY uid
) t ON d.uid = t.uid AND d.unixdate = t.max_unixdate;

原理说明:

  • 子查询部分按uid分组,用MAX(unixdate)拿到每个用户的最新时间戳
  • 外层通过uid和unixdate的双重匹配,精准定位到每个用户的最新条目

方法2:窗口函数(适用于MySQL 8.0+/PostgreSQL/SQL Server/Oracle等)

如果你的数据库支持窗口函数,这个方法更灵活,还能处理同个用户有多个相同最新时间条目的场景:

SELECT cid, uid, unixdate
FROM (
    SELECT 
        *,
        -- 按uid分组,组内按unixdate降序排号,最新的行号为1
        ROW_NUMBER() OVER (PARTITION BY uid ORDER BY unixdate DESC) AS rn
    FROM demo
) t
WHERE rn = 1;

进阶调整:

  • 如果想保留同个用户所有拥有最新unixdate的条目(比如某用户有两行unixdate都是129),把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可。

为什么你的原查询不对?

当你用GROUP BY uid时,数据库只会保证uid列是分组后的唯一值,但cid和unixdate如果不在聚合函数里,返回的是该分组内任意一行的值,完全不关联你想要的最新时间条目——这就是你得到错误结果的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:36