繁体   English   中英

更新前一年的值

[英]Updating previous year values

我有一个这样的表 T:

ID|DESC1_ID | DESC2_ID | TS     | CUM_MONTH_PREV_YEAR| CUM_MONTH_THIS_YEAR|ID2
--------------------------------------------------------------------------|-
1 |1        |1         |31.01.22|                    | 220                |1
----------------------------------------------------------------------------
2 |1        |2         |31.01.22|                    | 500                |1
---------------------------------------------------------------------------
3 |1        |3         |31.01.22|                    | 22                 |1
----------------------------------------------------------------------------
4 |2        |1         |31.01.22|                    | 50                 |1
---------------------------------------------------------------------------
5 |1        |1         |01.02.23|                    | 230                |2
----------------------------------------------------------------------------
6 |1        |2         |01.02.23|                    | 300                |2
---------------------------------------------------------------------------
7 |1        |3         |01.02.23|                    | 32                 |2
----------------------------------------------------------------------------
8 |2        |1         |01.02.23|                    | 30                 |2 

我希望为所有 id2 为 2 的条目更新字段 CUM_MONTH_PREV_YEAR。该值应该是前一年的值。 可能会发生,日期 (TS) 不完全是 1 年前的。 我在下面有一个查询,它可以执行我想要的操作。

UPDATE T t1  
    SET CUM_MONTH_PREV_YEAR = (SELECT NVL(CUM_MONTH_THIS_YEAR , 0)
                                FROM T t2
                              WHERE t2.TS = (SELECT MAX(TS) 
                                             FROM T
                                             WHERE TS BETWEEN  ADD_MONTHS( t1.TS - 7, -12) AND ADD_MONTHS( t1.TS, -12)
                                             AND DESC1_ID = t1.DESC1_ID
                                             AND DESC2_ID = t1.DESC2_ID )
                            AND t2.DESC1_ID = t.DESC1_ID
                            AND t2.DESC2_ID = t.DESC2_ID )  
WHERE ID2 = 2 ;

我想问一下是否有更好的方法来达到目标。

更新:

由于一切都被简化了,这只是巧合,前一年的 ID2 是 1 而今年是 2。在现实中有更多的值。

更新:这些值每天存储(在工作日)。

查看您的数据,我认为您正在寻找这个:

UPDATE table_name A
SET CUM_MONTH_PREV_YEAR = (SELECT B.CUM_MONTH_THIS_YEAR
                           FROM table_name B
                           WHERE A.id2 - 1 = B.id2
                             AND A.DESC1_ID = B.DESC1_ID
                             AND A.DESC2_ID = B.DESC2_ID);
                             
 SELECT *
 FROM table_name;    

在此处输入图像描述

更新的答案
即使某些日期在前一年不存在,也可以每天工作。 在这种情况下,会获取之前的第一个日期。

UPDATE A_TBL t
SET t.CUM_MONTH_PREV_YEAR = (  Select PREV_CUM  
                               From ( SELECT      t.DESC1_ID, t.DESC2_ID, MAX(t.TS) "TS", MAX(t.CUM_MONTH_THIS_YEAR) "PREV_CUM"
                                      FROM        A_TBL t
                                      INNER JOIN  A_TBL t2 ON(t2.DESC1_ID = t.DESC1_ID And t2.DESC2_ID = t.DESC2_ID)
                                      WHERE       To_Number(To_Char(t.TS, 'yyyymmdd')) <= To_Number(To_Char(ADD_MONTHS(t2.TS, -12), 'yyyymmdd'))
                                      GROUP BY    t.DESC1_ID, t.DESC2_ID 
                                    )
                              Where DESC1_ID = t.DESC1_ID And DESC2_ID = t.DESC2_ID  )
WHERE t.ID2 = 2;

您所需要的只是最内层的查询,它为您提供 ID2 = 2 的行中同一日期或前一年的第一个数据(一个更新)。 这是查询:

SELECT      t.DESC1_ID, t.DESC2_ID, MAX(t.TS) "TS", MAX(t.CUM_MONTH_THIS_YEAR) "PREV_CUM"
FROM        A_TBL t
INNER JOIN  A_TBL t2 ON(t2.DESC1_ID = t.DESC1_ID And t2.DESC2_ID = t.DESC2_ID)
WHERE       To_Number(To_Char(t.TS, 'yyyymmdd')) <= To_Number(To_Char(ADD_MONTHS(t2.TS, -12), 'yyyymmdd'))
GROUP BY    t.DESC1_ID, t.DESC2_ID 

  DESC1_ID   DESC2_ID TS          PREV_CUM
---------- ---------- --------- ----------
         2          1 31-JAN-22         50 
         1          2 31-JAN-22        500 
         1          3 31-JAN-22         22 
         1          1 31-JAN-22        220

更新后的结果是:

Select * From A_TBL;
ID DESC1_ID DESC2_ID TS CUM_MONTH_PREV_YEAR CUM_MONTH_THIS_YEAR ID2
1个 1个 1个 22 年 1 月 31 日 220 1个
2个 1个 2个 22 年 1 月 31 日 500 1个
3个 1个 3个 22 年 1 月 31 日 22 1个
4个 2个 1个 22 年 1 月 31 日 50 1个
5个 1个 1个 01-FEB-23 220 230 2个
6个 1个 2个 01-FEB-23 500 300 2个
7 1个 3个 01-FEB-23 22 32 2个
8个 2个 1个 01-FEB-23 50 30 2个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM