尝试将两个表连接在一起以使 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 |
+------------+---------------+----------------------+------------+
查看此工作演示
我已经起草了一些代码,但不确定如何完成,或者是否需要更多工作。看起来像这样。
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 |
+------------+---------------+----------------------+------------+
查看此工作演示