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

获取两种场景下用户最新数据:查询结果确认问询

按Type分组获取最新数据的SQL结果验证

原始数据

iD      | UserID  | Type  | EntryDate  | Score
------------------------------------------------
1       | B000-1  | A     | 2022-04-25 | 90
2       | B000-1  | B     | 2022-04-26 | 70
3       | B000-1  | A     | 2022-04-28 | 70
4       | B000-2  | A     | 2022-04-24 | 90

待验证的SQL片段

WHERE UserID='B000-1' GROUP BY Type ORDER BY EntryDate DESC

预期结果

iD      | UserID  | Type  | EntryDate  | Score
------------------------------------------------
2       | B000-1  | B     | 2022-04-26 | 70
3       | B000-1  | A     | 2022-04-28 | 70

结果分析

直接用上述SQL片段无法稳定得到预期结果,原因如下:

  • 按照SQL标准,GROUP BY Type后,SELECT子句中只能保留分组列(Type)或聚合函数(比如MAX(EntryDate)),其他未做聚合处理的列(iD、EntryDate、Score等)返回值是不确定的。
  • 即使在部分宽松模式的数据库(比如关闭ONLY_FULL_GROUP_BY的MySQL)中能运行,分组后非聚合列的取值是随机的,不一定会取到每个Type下EntryDate最新的那条数据。

如果要准确获取每个Type下EntryDate最新的记录,建议用窗口函数实现,示例SQL如下:

SELECT iD, UserID, Type, EntryDate, Score
FROM (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY Type ORDER BY EntryDate DESC) AS rn
    FROM 你的表名
    WHERE UserID='B000-1'
) t
WHERE rn = 1
ORDER BY EntryDate DESC;

这段SQL通过PARTITION BY Type按类型分组,ROW_NUMBER()给每组内的记录按EntryDate倒序编号,取编号为1的就是每组最新的记录,能稳定得到你想要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:10:28