如何从含重复唯一ID的查询结果中获取最新记录?
解决方案
要获取每个唯一ID(eight_id)对应的最新记录,最通用的方法是使用窗口函数ROW_NUMBER(),具体实现如下:
修改后的SQL语句
WITH ranked_trans AS ( SELECT tblEmpl.*, tblFtpTrans.actiondate, tblFtpTrans.actionflag, tblLocs.descript, -- 按eight_id分组,每个组内按actiondate降序编号,最新记录行号为1 ROW_NUMBER() OVER (PARTITION BY tblEmpl.eight_id ORDER BY tblFtpTrans.actiondate DESC) AS rn FROM tblEmpl LEFT JOIN tblFtpTrans ON tblEmpl.eight_id = tblFtpTrans.eight_id JOIN TblLocs ON tblLocs.location = tblEmpl.location WHERE (tblFtpTrans.ActionFlag='N' OR tblFtpTrans.ActionFlag = 'D') AND tblEmpl.estatus='A' AND tblEmpl.location='TRN' ) SELECT eight_id AS "Unique Id", fname, lname, actiondate FROM ranked_trans WHERE rn = 1 ORDER BY actiondate DESC;
逻辑说明
- CTE(公共表表达式)
ranked_trans:先关联所有需要的表,同时用ROW_NUMBER()给每个eight_id的记录编号——同一eight_id下,actiondate越新,行号rn越小(最新的为1)。 - 筛选最新记录:主查询中只保留
rn = 1的记录,即每个eight_id的最新一条数据。 - 排序:最后按
actiondate降序排列,和你期望的结果顺序一致。
兼容低版本数据库方案
如果你的数据库不支持CTE(比如MySQL 5.x),可以改用子查询实现:
SELECT eight_id AS "Unique Id", fname, lname, actiondate FROM ( SELECT tblEmpl.*, tblFtpTrans.actiondate, tblFtpTrans.actionflag, tblLocs.descript, ROW_NUMBER() OVER (PARTITION BY tblEmpl.eight_id ORDER BY tblFtpTrans.actiondate DESC) AS rn FROM tblEmpl LEFT JOIN tblFtpTrans ON tblEmpl.eight_id = tblFtpTrans.eight_id JOIN TblLocs ON tblLocs.location = tblEmpl.location WHERE (tblFtpTrans.ActionFlag='N' OR tblFtpTrans.ActionFlag = 'D') AND tblEmpl.estatus='A' AND tblEmpl.location='TRN' ) AS ranked_trans WHERE rn = 1 ORDER BY actiondate DESC;
内容的提问来源于stack exchange,提问作者Bill Judge
相关产品推荐
相关产品推荐

