如何按user_id分组获取各用户最新complete_date对应的完整行
解决按用户分组获取最新日期完整行的SQL问题
你的原查询报错,是因为SQL标准要求SELECT中的非聚合列必须出现在GROUP BY子句中。如果强行把bill_id加入GROUP BY,会按(user_id, bill_id)组合分组,结果就会和原表几乎一致,完全达不到需求。下面是几种可行的修改方案:
方法1:窗口函数(推荐,通用现代SQL写法)
利用ROW_NUMBER()窗口函数给每个用户的记录按日期倒序排序,筛选出排序第一的行(即最新日期的记录):
SELECT user_id, bill_id, complete_date FROM ( SELECT user_id, bill_id, complete_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY complete_date DESC) AS rn FROM tbl_user_complete ) t WHERE rn = 1;
PARTITION BY user_id:按用户ID分组ORDER BY complete_date DESC:每个组内按完成日期倒序排列rn = 1:取每个组内排序第一的记录,也就是该用户最新的那条账单
方法2:子查询关联
先获取每个用户的最大完成日期,再通过关联原表拿到对应的完整行:
SELECT t1.user_id, t1.bill_id, t1.complete_date FROM tbl_user_complete t1 INNER JOIN ( SELECT user_id, MAX(complete_date) AS max_date FROM tbl_user_complete GROUP BY user_id ) t2 ON t1.user_id = t2.user_id AND t1.complete_date = t2.max_date;
如果同一个用户存在多条相同最大日期的记录,这个方法会返回所有符合的行;若需仅返回一行,优先选择方法1。
内容的提问来源于stack exchange,提问作者Brother Eye
相关产品推荐
相关产品推荐

