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

如何修改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;

代码逻辑说明

  1. 子查询中用ROW_NUMBER()窗口函数:以OfferID为分组依据,每个分组内按DATE从新到旧排序,给每条记录分配行号,同一OfferID下日期最新的记录行号为1。
  2. 外层查询筛选行号为1的记录,得到所有OfferID的最新记录集合。
  3. 最后对这个集合按DATE降序排序,取前2条,就是你需要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:48:21