Snowflake Substring Concat 问题:无法识别数值“”

Posted

技术标签:

【中文标题】Snowflake Substring Concat 问题:无法识别数值“”【英文标题】:Snowflake Substring Concat Issue: Numeric value '' is not recognized 【发布时间】:2021-10-19 21:58:57 【问题描述】:

有一个财政季度列,我想在同一行中添加一个显示上一季度的列。我已经在画面中成功地做到了这一点,逻辑如下。

IF RIGHT([current_qtr], 1) = "1"
THEN LEFT([current_qtr],2)+ STR(INT(MID([current_qtr], 3,2)) -1) +"Q4"
ELSE LEFT([current_qtr],5)+ STR(INT(RIGHT([current_qtr],1)) -1)
END

雪花中的预期输出示例

current_qtr previous_qtr other columns
FY21Q1 FY20Q4 etc
FY21Q2 FY21Q1 etc

当我尝试在雪花中执行此操作时,虽然我不断收到此“数值 '' 无法识别错误。任何想法如何解决?以下是我尝试的。

SELECT *,
CASE 
   WHEN SUBSTR(p.current_qtr,5,1) = 1 
      THEN SUBSTR(p.current_qtr,1,2) || TRY_CAST(SUBSTR(p.current_qtr,3,2) as INTEGER)-1 || 'Q4'
      ELSE SUBSTR(p.current_qtr,5,1) || TRY_CAST(SUBSTR(p.current_qtr,3,2) as INTEGER)-1
   End As prev_qtr
   FROM table as p 

【问题讨论】:

【参考方案1】:

这个逻辑看起来可能比一个查询中的一大堆奇怪的 SQL 更好:

create or replace function prev_quarter_formatted(x string)
returns string
as
$$
(
    select 'FY' || to_varchar(prev_q, '%y') || 'Q' || quarter(prev_q)
    from (
        select substr(x, 3,2) year
            , (1+3*(substr(x, 6,1)::int-1)) q_to_month
            , to_date(year||'-'||q_to_month||'-01', 'yy-mm-dd') as_date
            , dateadd(month, -3, as_date) prev_q
    )
)
$$
;


select prev_quarter_formatted('FY21Q1') a
;

请注意,对于逻辑,我将季度转换为日期,减去 3 个月,然后再次格式化。

【讨论】:

【参考方案2】:

转换的语法有一些细微的差别。您可以使用当前的 CASE 语句进行一些小的调整:

SELECT *,
CASE 
   WHEN SUBSTR(p.current_qtr,6,1) = '1' 
      THEN SUBSTR(p.current_qtr,1,2) || ((SUBSTR(p.current_qtr,3,2))::int - 1) || 'Q4'
      ELSE SUBSTR(p.current_qtr,1,2) || SUBSTR(p.current_qtr,3,2) || (SUBSTR(p.current_qtr,3,2)::int-1)
END AS prev_qtr
FROM table1 as p 

【讨论】:

以上是关于Snowflake Substring Concat 问题:无法识别数值“”的主要内容,如果未能解决你的问题,请参考以下文章

10.Pandas实现数据的合并conca

实用sql函数group_conca我知道你想group_concat和count一起用,比如不同组合的人数?

有限制的子字符串 (pyspark.sql.Column.substr)

如何在 Snowflake 中找到我的 Snowflake 账单?

Snowflake 是不是支持索引?

sqitch init snowflake 无法确定 Snowflake 账户名