尝试将两个表连接在一起以使 unit_price 根据日期变化

Trying to join two tables together to have the unit_price vary based on the day

我已经起草了一些代码,但不确定如何完成,或者是否需要更多工作。看起来像这样。

select p.product_id, p.product_name, pp.effective_date, pp.unit_price
from products p
inner join product_price pp
on p.product_id = pp.product_id
where (....stuck here)

一切看起来都不错,但我如何根据给定的生效日期获得价格?给定的生效日期是 01/01/2021。我在想可能是这样的地方:

where effective_date = 01/01/2021;

虽然我不确定这是否正确。我尝试了 运行 它和类似的 where 语句,但没有任何结果。

示例数据:

产品

P_id, p_name
11  ,  boys shorts

product_price

p_id, eff_date , unit_price
11  , 01-JAN-21, 10.48

我希望产品的价格现在是基于给定日期的计算,使用 Products 和 Product_Price 之间的连接。

[

当价格数据只存储一个日期时,通常意味着“从这个日期开始使用这个价格,但只能到下一个 date_effective”。

window 函数 row_number() 为每一行分配一个整数,在相关的 over clause 中, partition by 控制用于从 1 和order by 确定分区内行和数字的顺序。因此,通过使用降序日期顺序,可以使用行号 1 标识每个分区的最新日期。

如果将此技术与小于或等于给定日期的生效日期的过滤器结合使用,则将返回给定日期适用的价格。:

select p.product_id, p.product_name, pp.effective_date, pp.unit_price
from products p
inner join (
           select
               product_price.*
             , row_number() over(partition by product_id order by effective_date DESC) as rn
           from product_price
           where effective_date <= to_date('01/01/2021','dd/mm/yyyy')
           ) pp on p.product_id = pp.product_id
            and pp.rn = 1 /* only the relevant date/price is returned */

第二个连接条件可以用作 where 条件

select p.product_id, p.product_name, pp.effective_date, pp.unit_price
from products p
inner join (
           select
               product_price.*
             , row_number() over(partition by product_id order by effective_date DESC) as rn
           from product_price
           where effective_date <= to_date('01/01/2021','dd/mm/yyyy')
           ) pp on p.product_id = pp.product_id
where pp.rn = 1 /* only the relevant date/price is returned */

示例数据

CREATE TABLE PRODUCTS ( 
PRODUCT_ID      INTEGER, 
PRODUCT_NAME VARCHAR(100));

CREATE TABLE PRODUCT_PRICE ( 
PRODUCT_ID     INTEGER, 
EFFECTIVE_DATE DATE , 
UNIT_PRICE     DECIMAL(12,3));

INSERT INTO PRODUCTS VALUES(100,'Product: 100');
INSERT INTO PRODUCTS VALUES(3412,'Product: 3412');
INSERT INTO PRODUCTS VALUES(1034,'Product: 1034');
INSERT INTO PRODUCTS VALUES(775522,'Product: 775522');
INSERT INTO PRODUCTS VALUES(101,'Product: 101');
INSERT INTO PRODUCTS VALUES(2342,'Product: 2342');
INSERT INTO PRODUCTS VALUES(8643,'Product: 8643');
INSERT INTO PRODUCTS VALUES(99771,'Product: 99771');
INSERT INTO PRODUCTS VALUES(2324,'Product: 2324');
INSERT INTO PRODUCTS VALUES(103,'Product: 102');

INSERT INTO PRODUCT_PRICE VALUES(100, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);
INSERT INTO PRODUCT_PRICE VALUES(101, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);
INSERT INTO PRODUCT_PRICE VALUES(103, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);
INSERT INTO PRODUCT_PRICE VALUES(1034, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);
INSERT INTO PRODUCT_PRICE VALUES(2342, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);
INSERT INTO PRODUCT_PRICE VALUES(3412, TO_DATE('2020-09-01','YYYY-MM-DD'),10.12);

INSERT INTO PRODUCT_PRICE VALUES(100, TO_DATE('2021-01-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(101, TO_DATE('2020-11-11','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(103, TO_DATE('2021-01-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(1034, TO_DATE('2020-11-11','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(2342, TO_DATE('2021-01-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(3412, TO_DATE('2020-12-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(8643, TO_DATE('2021-01-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(99771, TO_DATE('2021-02-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(2324, TO_DATE('2021-01-01','YYYY-MM-DD'),10.43);
INSERT INTO PRODUCT_PRICE VALUES(775522, TO_DATE('2021-03-01','YYYY-MM-DD'),10.43);

结果

+------------+---------------+----------------------+------------+
| PRODUCT_ID | PRODUCT_NAME  |    EFFECTIVE_DATE    | UNIT_PRICE |
+------------+---------------+----------------------+------------+
|        100 | Product: 100  | 2021-01-01T00:00:00Z |      10.43 |
|        101 | Product: 101  | 2020-11-11T00:00:00Z |      10.43 |
|        103 | Product: 102  | 2021-01-01T00:00:00Z |      10.43 |
|       1034 | Product: 1034 | 2020-11-11T00:00:00Z |      10.43 |
|       2324 | Product: 2324 | 2021-01-01T00:00:00Z |      10.43 |
|       2342 | Product: 2342 | 2021-01-01T00:00:00Z |      10.43 |
|       3412 | Product: 3412 | 2020-12-01T00:00:00Z |      10.43 |
|       8643 | Product: 8643 | 2021-01-01T00:00:00Z |      10.43 |
+------------+---------------+----------------------+------------+

http://sqlfiddle.com/#!4/8a6c9/2

查看此工作演示