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

PostgreSQL两表关联:按ID匹配查询表1早于表2的最近日期数据

问题解答

思路正确性判断

你提出的实现思路完全正确,属于这类同ID最近日期匹配场景的标准实现逻辑。

具体实现方式

方案1:关联后窗口函数取TOP1(全数据库兼容)

先按你说的规则关联两张表,再用窗口函数分组排序取排名第一的记录即可,通用SQL示例:

WITH merge_tbl AS (
  SELECT
    t1.id,
    t1.date t1_date,
    t2.date t2_date,
    -- 补充需要查询的其他字段
    ROW_NUMBER() OVER(PARTITION BY t1.id, t2.date ORDER BY t1.date DESC) AS rn
  FROM table1 t1
  INNER JOIN table2 t2
  ON t1.id = t2.id AND t1.date <= t2.date
)
SELECT * FROM merge_tbl WHERE rn = 1;

如果同ID同最大日期下的多条表1记录都需要保留,将ROW_NUMBER()替换为RANK()即可。

方案2:LATERAL JOIN简化实现(支持新版本SQL引擎)

如果你使用的是PostgreSQL、MySQL 8.0.14+、Spark SQL、Hive 2.0+等支持横向关联的引擎,可以用更简洁的写法,性能也更优:

SELECT 
  t2.*,
  t1_match.*
FROM table2 t2
LEFT JOIN LATERAL (
  SELECT * FROM table1 t1
  WHERE t1.id = t2.id AND t1.date <= t2.date
  ORDER BY t1.date DESC
  LIMIT 1
) t1_match ON TRUE;

边界情况处理

如果存在表2某条记录的日期早于对应ID下表1的所有日期,上面的内连接写法会过滤掉该记录,需要保留的话把INNER JOIN改为LEFT JOIN,缺失的表1字段会自动补NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:15:06