首页 > 解决方案 > 根据 3 个变量和语法错误计算天数

问题描述

我希望你能就几个问题提供一些见解:

ISSUE 1 - 我收到以下在 Teradata 中运行的错误消息:“语法错误,在整数和 'then' 关键字之间应出现类似 ')' 的内容。”

我的数据中有一些重复的记录,我想说的是,如果所有条件都满足,那么 Age in Days 等于 1,否则,计算天数。

ISSUE 2 - date_diff 计算不正确(见表格)

Date_Phase_Modified 历史阶段 Date_Diff
2021 年 1 月 4 日 20:33 关闭 显示 0 - 想看 1
2021 年 1 月 4 日 20:32 实施 63 - 这是正确的
2020 年 12 月 1 日 18:34 实施 显示 29 - 想看 0
2020 年 11 月 2 日 18:20 实施 0 - 这是正确的
2020 年 10 月 21 日 20:07 早期 显示 0 - 想看 1
2020 年 10 月 21 日 20:06 早期 0 - 这是正确的
2020 年 10 月 21 日 19:59 早期 0 - 这是正确的
CASE when((
MAX(cast(Date_Phase_Modified as date format 'MM/DD/YYYY')) - MIN(cast(Date_Phase_Modified as date format 'MM/DD/YYYY')) 
            over (partition by F.oprty_key_nbr, Historical_Phases order by Historical_Phases, Date_Phase_Modified asc) Day(4)) = 0 then 1 else 
            
MAX(cast(Date_Phase_Modified as date format 'MM/DD/YYYY')) - MIN(cast(Date_Phase_Modified as date format 'MM/DD/YYYY')) 
            over (partition by F.oprty_key_nbr, Historical_Phases order by Historical_Phases, Date_Phase_Modified asc) Day(4)) 

end as Age_In_Phase,

标签: sqlsyntaxteradata

解决方案


这似乎符合您的预期结果:

CASE 
  WHEN Date_Phase_Modified = -- for latest row per phase
                      Max(Date_Phase_Modified) Over (PARTITION BY F.oprty_key_nbr, Historical_Phases ) 
  THEN -- return duration of phase, but at least 1 day
       Greatest( Cast(Max(Date_Phase_Modified) Over (PARTITION BY F.oprty_key_nbr, Historical_Phases ) AS DATE)
                -Cast(Min(Date_Phase_Modified) Over (PARTITION BY F.oprty_key_nbr, Historical_Phases ) AS DATE)
               , 1) 
  ELSE 0
END AS Age_In_Phase

推荐阅读