首页 > 解决方案 > 如何根据最近的日期将值归因于行

问题描述

我正在尝试根据最接近的 run_date 将“收入”的值归因于一行,并及时向前看。我使用日期范围作为连接条件,仅在 10 天“前瞻”期间内将行与以下内容连接......

SELECT 
* 
FROM t1 
  INNER JOIN t2 ON t1.id = t2.id 
  AND t2.date BETWEEN t1.run_date AND DATE_ADD(t1.run_date, INTERVAL 10 DAY)

最右边的表是我想要实现的:

在此处输入图像描述

有人对如何获得我的预期结果有任何建议吗?(图片最右边的表格)

如果有人有兴趣帮忙,我在这里有一个 SQL 小提琴。

标签: sql

解决方案


t1需要与自身进行比较才能找到所属的t1t2。这样做你需要加入t1两次。您可以将一个子选择用于测试是否存在更合适的 t1 到 an 的条件中OUTER JOIN,如下所示:

SELECT 
t1.id, c_id, run_date, coalesce(revenue,0) revenue
FROM t1 
  LEFT OUTER JOIN t2 ON t1.id = t2.id 
  AND t2.date BETWEEN t1.run_date AND DATE_ADD(t1.run_date, INTERVAL 10 DAY)
  AND NOT EXISTS (
    SELECT 'X'
    FROM t1 as later
    WHERE t1.id = t2.id
    AND later.run_date < t2.date
    AND t1.run_date < later.run_date
)
ORDER BY run_date

推荐阅读