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 问题:无法识别数值“”的主要内容,如果未能解决你的问题,请参考以下文章
实用sql函数group_conca我知道你想group_concat和count一起用,比如不同组合的人数?
有限制的子字符串 (pyspark.sql.Column.substr)