我有两张桌子 -
values
:
id | date | value1 | value2
===+===========+========+=======
1 |2023-10-01 | 10 | 100
2 |2023-10-02 | 20 | 200
3 |2023-10-03 | 30 | 300
4 |2023-10-04 | 40 | 400
5 |2023-10-05 | 50 | 500
和
rates
:
date | rate1 | rate2
==========+=======+======
2023-01-01| 0.20| 0.50
2023-10-04| 0.40| 0.60
2024-01-01| 0.30| 0.40
我需要创建一个显示以下数据的视图:
date | vr1 | vr2 | svr
==========+======+=======+======
2023-10-01| 2.0 | 50.0 | 52.0
2023-10-02| 4.0 | 100.0 | 104.0
2023-10-03| 6.0 | 150.0 | 156.0
2023-10-04| 16.0 | 240.0 | 256.0
2023-10-05| 20.0 | 300.0 | 320.0
这些值必须乘以该日期的有效汇率。从 2023 年 10 月 4 日开始,必须使用新费率。
我尝试过以下SQL:
SELECT DiSTINCT d.date,
v.value1 * r.rate1 AS vr1,
v.value2 * r.rate2 AS vr2,
v.value1 * r.rate1 + v.value2 * r.rate2 AS svr
FROM values AS v INNER JOIN rates AS r
WHERE v.date >= r.date
但是得到:
date | vr1 | vr2 | svr
==========+======+=======+======
2023-10-01| 2.0 | 50.0 | 52.0
2023-10-02| 4.0 | 100.0 | 104.0
2023-10-03| 6.0 | 150.0 | 156.0
2023-10-04| 8.0 | 200.0 | 208.0 <= unwanted
2023-10-04| 16.0 | 240.0 | 256.0
2023-10-05| 10.0 | 250.0 | 260.0 <= unwanted
2023-10-05| 20.0 | 300.0 | 320.0
如果您不想更改原始表格,您可以尝试以下操作:
WITH date_range AS
(SELECT *,
LEAD(date) OVER (ORDER BY date) as next_date
FROM rates)
SELECT v.date,
v.value1 * r.rate1 AS vr1,
v.value2 * r.rate2 AS vr2,
(v.value1 * r.rate1) + (v.value2 * r.rate2) as svr
FROM vals v
INNER JOIN date_range r
ON v.date >= r.date
AND v.date < r.next_date
;
窗口函数 LEAD 将获取下一个费率开始的日期,连接条件将过滤掉费率变化之后的额外行。
作为替代方案,您还可以将 last_date 列添加到费率表中,并在任何连接条件中使用它。