需要帮助在大查询中构建 Decode 语句

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

我在 Oracle 中编写了一个查询,现在需要将其转换为大查询格式,我对大查询非常陌生,需要您的帮助

(to_char(解码(符号(解码(to_char(c.last_updated_time +3, 'D') ,7 , c.last_updated_time +5 ,1 ,c.last_updated_time +5, 2, c.last_updated_time +5,3, c .last_updated_time +4, c.last_updated_time +3) -sysdate),-1,3,1)),' ') 优先级

sql oracle google-bigquery
1个回答
0
投票

首先我们使用

last_updated_time
生成一些样本数据。
Priority
日期晚几天,具体取决于星期几。所以模拟一个周末和工作日。因此,添加到
last_updated_time
是通过
TIMESTAMP_ADD
完成的。由于
Interval
是 根据星期几(从 1 到 7 的数字),使用以下语句:

CASE day_of_the_week WHEN 7 then adding_value ... end

所以我们最终得到这个查询:

WITH
  tbl AS (
  SELECT * 
  from unnest(generate_timestamp_array(timestamp "2023-01-01",timestamp "2023-02-01",interval 1 day ) ) as last_updated_time
     )
SELECT *,
  TIMESTAMP_ADD( c.last_updated_time, INTERVAL (
      CASE EXTRACT(DAYOFWEEK FROM TIMESTAMP_ADD(c.last_updated_time, INTERVAL 3 DAY))
        WHEN 7 THEN 5
        WHEN 1 THEN 4
        WHEN 2 THEN 4
        WHEN 3 THEN 4
      ELSE 3
    END
      ) DAY ) AS Priority_A,
  CASE
    WHEN EXTRACT(DAYOFWEEK FROM TIMESTAMP_ADD(c.last_updated_time, INTERVAL 3 DAY)) = 7 THEN 
      TIMESTAMP_ADD(c.last_updated_time, INTERVAL 5 DAY)
    WHEN EXTRACT(DAYOFWEEK FROM TIMESTAMP_ADD(c.last_updated_time, INTERVAL 3 DAY)) IN (1, 2, 3) THEN 
      TIMESTAMP_ADD(c.last_updated_time, INTERVAL 4 DAY)
  ELSE
    TIMESTAMP_ADD(c.last_updated_time, INTERVAL 3 DAY)
END
  AS Priority_B
FROM
  tbl AS c
  order by 1

如您所见,提出了另一种解决方案,其中先完成星期几的案例陈述,然后对每个案例进行日期计算。

© www.soinside.com 2019 - 2024. All rights reserved.