获取两种场景下用户最新数据:查询结果确认问询
按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
相关产品推荐
相关产品推荐

