选择具有日期依赖性的 VIEW

问题描述 投票:0回答:1

我有两张桌子 -

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
sql join view
1个回答
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 列添加到费率表中,并在任何连接条件中使用它。

© www.soinside.com 2019 - 2024. All rights reserved.