花一个月的时间回到teradata sql

时间:2017-03-23 14:00:57

标签: sql teradata

我有一些表(样本带到这里),就像这样

得分(每个分数每个月计算一次得分,特定月份为28)

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的逻辑:

如果agreement_date当月的日期少于" 28"然后带上协议日期前一个月的分数。 如果日期大于或等于" 28"然后将该月的分数等于协议日期的月份。

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

任何帮助如何做到这一点?感谢' S。我在想"加入"然后在""的情况下减去1"但是当日期是'dd-01 -YYYY'时,我不知道如何处理这个案子。在sql-teradata。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul data-id="2">
    <li>
        <span>Item name</span>
    </li>
    <li>
        <span>Item name 2</span>
    </li>
    <li>
        <span>Item name 3</span>
    </li>
</ul>

答案 2 :(得分:0)

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
                )