首页 > 解决方案 > SQL:LEFT JOIN 基于另一个表的生效日期

问题描述

我有两个表:[transaction_table] (t) 和 [rate_table] (r)

我想根据 t.transaction_date 和 r.effective_date 和产品 FROM [transaction_table] LEFT JOIN [rate_table]。
有谁知道怎么做?提前致谢。

这是我的代码:但它返回了不想要的结果

SELECT t.*, r.rate 
FROM [transaction_table] t 
LEFT JOIN [rate_table] r on (t.product = r.product and t.transaction_date >= r.effective_date)

期望结果:交易表 LEFT JOIN 费率表,费率根据有效日期

交易日期 产品 上午 速度
2020-01-01 一种 200 0.2
2020-04-01 一种 200 0.3
2020-04-01 100 0.1
2021-01-01 一种 200 0.5

[Transaction_Table]:包含不同产品的所有交易

交易日期 产品 上午
2020-01-01 一种 200
2020-04-01 一种 200
2020-04-01 100
2021-01-01 一种 200

[Rate_Table]:包含具有“有效日期”的不同产品的费率调整

生效日期 产品 速度
2019-01-01 一种 0.2
2019-01-01 0.1
2020-04-01 一种 0.3
2020-09-01 一种 0.5

标签: sqlsql-serverleft-join

解决方案


您在交易日期之前加入所有费率,而您只想获得最新的。您可以通过TOP(1)OUTER APPLY

select t.*, r.rate 
from transaction_table t 
outer apply
(
  select top(1) *
  from rate_table r 
  where r.product = t.product 
  and r.effective_date <= t.transaction_date
  order by r.effective_date desc
);

或在SELECT子句中的子查询中:

select
  t.*,
  (
    select top(1) r.rate 
    from rate_table r 
    where r.product = t.product 
    and r.effective_date <= t.transaction_date
    order by r.effective_date desc
  ) as rate
from transaction_table t;

推荐阅读