如何修改SQL查询:OfferID相同时保留最新日期记录
问题描述
我拥有table1和table2两张表,想要筛选出姓氏匹配特定值的ID、OfferID和Date字段,且仅保留最新的2条记录。当前使用的查询可正常运行,但当OfferID重复时,我希望仅保留该OfferID下日期最新的那条记录——当前查询输出存在OfferID重复的情况,期望最终输出中每个OfferID只保留最新日期的记录,再取最新的2条不重复的OfferID记录。
原查询代码:
SELECT Table1.DATE, Table1.OfferID, Table2.ID FROM TABLE1 JOIN TABLE2 ON TABLE1.ID = TABLE2.ID WHERE TABLE2.LASTNAME = "DOE" ORDER BY Table1.DATE DESC OFFSET 0 ROW FETCH FIRST 2 ROW ONLY;
解决方案
使用窗口函数ROW_NUMBER()可以实现你的需求,先确保每个OfferID只保留最新日期的记录,再取其中最新的2条:
修改后的查询代码:
SELECT DATE, OfferID, ID FROM ( SELECT Table1.DATE, Table1.OfferID, Table2.ID, -- 按OfferID分组,组内按日期降序排,给每条记录标记行号 ROW_NUMBER() OVER (PARTITION BY Table1.OfferID ORDER BY Table1.DATE DESC) AS rn FROM TABLE1 JOIN TABLE2 ON TABLE1.ID = TABLE2.ID WHERE TABLE2.LASTNAME = "DOE" ) AS ranked_records -- 只保留每个OfferID下最新的那条记录(行号为1) WHERE rn = 1 -- 按日期降序排序后取前2条 ORDER BY DATE DESC OFFSET 0 ROW FETCH FIRST 2 ROW ONLY;
代码逻辑说明
- 子查询中用
ROW_NUMBER()窗口函数:以OfferID为分组依据,每个分组内按DATE从新到旧排序,给每条记录分配行号,同一OfferID下日期最新的记录行号为1。 - 外层查询筛选行号为1的记录,得到所有OfferID的最新记录集合。
- 最后对这个集合按
DATE降序排序,取前2条,就是你需要的结果。
内容的提问来源于stack exchange,提问作者traveltheworld
相关产品推荐
相关产品推荐

