
[英]Updating query to return most recent revenue date/value prior to previous year/quarter date/values (snowflake)
[英]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 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.