You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关联查询中重复日期数据的筛选逻辑实现求助

关联查询中重复日期数据的筛选逻辑实现求助

嗨,我来帮你搞定这个问题!你的需求核心是在关联A、B两张表后,针对同一个ID下出现的重复Date值,只保留对应A表中Date2最新的那条记录对吧?这个场景用窗口函数来处理是最简洁高效的,下面给你详细的解决方案:

核心思路

我们需要先对关联后的数据集按「ID + Date」进行分组,在每个分组内部按照Date2的时间从新到旧排序,然后只保留每组里排序第一的那条记录——这样就能自动过滤掉同一ID+Date下Date2较旧的重复数据了。

完整SQL代码

WITH ranked_data AS (
    SELECT 
        B.ID, 
        A.Date, 
        A.Value,
        -- 给每个ID+Date分组的行按Date2降序分配序号,最新的Date2对应序号1
        ROW_NUMBER() OVER(PARTITION BY B.ID, A.Date ORDER BY A.Date2 DESC) AS rn
    FROM A
    INNER JOIN B ON A.key = B.key
)
SELECT ID, Date, Value
FROM ranked_data
WHERE rn = 1;

代码解释

  • CTE(公共表表达式)ranked_data:先完成A和B的内连接,同时用ROW_NUMBER()窗口函数给每条记录标记序号:
    • PARTITION BY B.ID, A.Date:指定分组依据——同一个ID且同一个Date的记录会被分到一组
    • ORDER BY A.Date2 DESC:每组内按Date2从新到旧排序,最新的Date2对应的记录会被分配序号1
  • 外层查询:只筛选序号rn = 1的记录,这样就得到了每个ID+Date组合下Date2最新的唯一一条数据,完全符合你的需求。

对应你的示例验证

拿你给出的Table A的例子来说,假设关联后对应的ID是同一个值,两条记录的Date都是01-01-2000

  • 第一条的Date2是01-02-2000,会被分配序号2
  • 第二条的Date2是01-03-2003,会被分配序号1
    最终外层查询只会保留序号为1的第二条记录,完美匹配你想要的结果。

额外补充

如果你的Date2字段存在NULL值,担心排序异常的话,可以把排序规则改成ORDER BY A.Date2 DESC NULLS LAST,确保非空的最新Date2优先被选中。

备注:内容来源于stack exchange,提问作者singlequit

火山引擎 最新活动