【问题标题】:Take one month back in teradata sql在 teradata sql 中恢复一个月
【发布时间】:2017-08-16 03:21:12
【问题描述】:

我有一些这样的桌子(样品被带到这里)

scores(特定月份28中的每个branch_cust每个月计算一次分数)

Branch_cust model_date score 
1            28/12/2013  4
1            28/01/2014  3
1            28/02/2014  2
1            28/03/2014  7
1            28/04/2014  3
1            28/05/2014  5
1            28/06/2014  6
2            28/12/2013  9
2            28/01/2014  10
2            28/02/2014  12
2            28/03/2014  11
2            28/04/2014  10
2            28/05/2014  7
2            28/06/2014  8

贷款:

Branch_cust agreement_date 
1              05-01-2014        
1              29-01-2014        
2              27-02-2014         
2              28-02-2014        

贷款:

想要的输出:

Branch_cust agreement_date loan_open_score
1              05-01-2014        4
1              29-01-2014        3
2              27-02-2014        10  
2              28-02-2014        12

创建loan_open_score的逻辑:

如果协议日期当月的日期小于“28”,则将前一个月的分数带到协议日期的月份。 如果日期大于或等于“28”,则将月份的分数与协议日期的月份相同。

示例:在 branch_cust = 1 的示例数据中,agreement_date 是 05-01-2014 - 意思是 - day = 5 所以我需要回到 2013 年 12 月并从那里获取分数。

任何帮助如何做到这一点?谢谢。我正在考虑“加入”,然后在“..”的情况下减去 1,但是当 sql-teradata 中的日期为“dd-01-YYYY”时,我不知道如何处理这种情况。

更新:日期的列数据类型是日期。

【问题讨论】:

  • 列数据类型? (型号日期和协议日期)
  • 列数据类型为日期。

标签: sql teradata


【解决方案1】:

trunc(agreement_date,'mon') + 27 返回当前月份的 28 日。现在您可以应用一些逻辑并在此计算日期加入:

case when            trunc(agreement_date,'mon') + 27 > agreement_date
     then add_months(trunc(agreement_date,'mon') + 27,-1)
     else            trunc(agreement_date,'mon') + 27
end

【讨论】:

    【解决方案2】:

    另一种选择是获取每个协议日期的最新 model_date 并将其加入分数表。这样您就不必操纵日期。

    select t.branch_cust,t.agreement_Date,s.score
    from scores s
    join (select distinct l.branch_cust,l.agreement_Date
          ,max(s.model_Date) over(partition by l.branch_cust,l.agreement_Date) as max_model_Date
          from scores s
          join loans l on s.branch_cust=l.branch_cust and l.agreement_Date >= s.model_Date
          ) t 
    on s.branch_cust=t.branch_cust and s.model_Date=t.max_model_Date
    

    【讨论】:

      【解决方案3】:
      select  *
      
      from            scores  as s
              join    loans   as l
      
              on      l.Branch_cust   =
                      s.Branch_cust
      
                  and l.model_date    =
                      add_months 
                      (
                          trunc(S.agreement_date,'mm')+27
                         ,case when extract(day from s.agreement_date) < 28 then -1 else 0 end
                      )
      

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多