Oracle 12c PLSQL - 根据日期从先前记录中获取/更新金额值

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

发布我的第一个问题。如有任何发帖错误,请原谅。我非常感谢能够从一处解决我的问题的答案。

我有一张名为“定价”的表。下面是ddl。

CREATE TABLE PRICING (ITEM          VARCHAR2(80) NOT NULL,
                      LOCATION      NUMBER(10)   NOT NULL,
                      PRICE_DATE    DATE         NOT NULL,
                      PRICE_TYPE    VARCHAR2(2)  NOT NULL,
                      RETAIL_VALUE  NUMBER(20,4),
                      LAST_RETAIL   NUMBER(20,4) );

该表有以下几条记录。

Insert into PRICING  values ('30888273',77,to_date('20-SEP-20','DD-MON-RR'),'0',2,NULL);
Insert into PRICING  values ('30888273',77,to_date('03-MAR-23','DD-MON-RR'),'8',1.4,NULL);
Insert into PRICING  values ('30888273',77,to_date('06-MAR-23','DD-MON-RR'),'4',3,NULL);
Insert into PRICING  values ('30888273',77,to_date('04-APR-23','DD-MON-RR'),'8',1.4,NULL);
Insert into PRICING  values ('30888273',77,to_date('10-APR-23','DD-MON-RR'),'4',4,NULL);
Insert into PRICING  values ('30888273',77,to_date('02-MAY-23','DD-MON-RR'),'8',1.4,NULL);
Insert into PRICING  values ('30888273',77,to_date('08-MAY-23','DD-MON-RR'),'4',5,NULL);
Insert into PRICING  values ('30888273',77,to_date('30-MAY-23','DD-MON-RR'),'8',1.4,NULL);
Insert into PRICING  values ('30888273',77,to_date('05-JUN-23','DD-MON-RR'),'4',6,NULL);
Insert into PRICING  values ('30888273',77,to_date('04-JUL-23','DD-MON-RR'),'8',1.4,NULL);
Insert into PRICING  values ('30888273',77,to_date('05-JUL-23','DD-MON-RR'),'4',7,NULL);
commit;

使用此查询检查表中的数据。

select * from PRICING order by price_date;

输出是这样的 -

我想要的是这个——

即对于price_type为8的每条记录,last_retail列从retail_value列的上一个(按日期)和最新值获取其值,其中price_type为0或4。最好是一个Update语句来解决这个问题。

感谢您提前查看并回答。

问候, 蔡

plsql oracle12c
1个回答
0
投票

无需更新您的表格,您可以在查询中使用

LAG
分析函数获得此结果:

SELECT item
      ,location
      ,price_date
      ,price_type
      ,retail_value
      ,CASE
           WHEN price_type = 8 THEN
              LAG(retail_value
                  ,1
                  ,0)
              OVER(
                  ORDER BY price_date
              )
           ELSE
              NULL
        END AS last_retail
  FROM pricing;

ITEM         LOCATION PRICE_DATE  PR RETAIL_VALUE LAST_RETAIL
---------- ---------- ----------- -- ------------ -----------
30888273           77 20-SEP-2020 0             2            
30888273           77 03-MAR-2023 8           1.4           2
30888273           77 06-MAR-2023 4             3            
30888273           77 04-APR-2023 8           1.4           3
30888273           77 10-APR-2023 4             4            
30888273           77 02-MAY-2023 8           1.4           4
30888273           77 08-MAY-2023 4             5            
30888273           77 30-MAY-2023 8           1.4           5
30888273           77 05-JUN-2023 4             6            
30888273           77 04-JUL-2023 8           1.4           6
30888273           77 05-JUL-2023 4             7          
© www.soinside.com 2019 - 2024. All rights reserved.