sql - 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 |
解决方案
您在交易日期之前加入所有费率,而您只想获得最新的。您可以通过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;
推荐阅读
- sql-server - 基于背景颜色 ssrs 的总和
- clojure - clojure ogre 中的文本和字符串搜索以查询 Janusgraph - 找不到任何函数或方法
- angular - 如何将js转换为内容浏览器的Ts?
- batch-file - 如何生成 00 和 FF 之间但没有相等字符组合的随机值?
- azure - 是否可以通过 Az Cmdlet 以编程方式路由 Slot 流量?
- python - 消除 CSV 文件中不需要的换行符
- django - pip 找不到满足要求的版本 django==2.2.1
- javascript - 是否有任何等效于 C# 中 JavaScript 的 decodeURIComponent() 的方法?
- wordpress - 按订单获取客户自定义元数据
- reactjs - 从 Ant Design Table 获取当前表数据