微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql 中的动态查询 - 滚动发薪日率

如何解决postgresql 中的动态查询 - 滚动发薪日率

我在 postgresql 中运行查询获取一组客户在截止日期 t+1 (fe02-28-2015) 中的发薪日类别 - 上个月 t (fe01-31-2015) .结果是令人满意的,但是,如果我想要从 2015 年 1 月到 2020 年 1 月的滚动率,我必须逐月运行,更改月份 t 和月份 t +1。 他们知道以某种方式通过执行一次查询(可能是循环)来获得结果。 提前致谢。

--creating the categories for month t plus 1 (Feb15)

DROP TABLE IF EXISTS rolls_rate_t_plus_1;
CREATE TEMP TABLE rolls_rate_t_plus_1 AS (SELECT 
                         a.co_contra -- Primary key,a.pe_produc -- Month of production,(CASE
                        WHEN a.co_diamorcro <= 0 THEN '0 dpd'
                        WHEN a.co_diamorcro > 0 AND a.co_diamorcro <= 8 THEN '1-8 dpd'
                        WHEN a.co_diamorcro > 8 AND a.co_diamorcro <= 30 THEN '9-30 dpd'
                        WHEN a.co_diamorcro > 30 AND a.co_diamorcro <= 60 THEN '31-60 dpd'
                        WHEN a.co_diamorcro > 60 AND a.co_diamorcro <= 120 THEN '61-120 dpd'
                        WHEN a.co_diamorcro > 120  then '>120 dpd' 
                        ELSE 'Refinanced and canceled' END ) AS rolls_rate_t_plus_1 -- Rolls rate (paydays) category in month t plus 1  (February)       
                        FROM risk.portfolio_wfcore a
                        WHERE 
                        pe_produc= (date_trunc('month',a.pe_produc + interval '1 month' - interval '1 day')::date -1) -- Last day of the month
                        AND to_char(pe_produc,'yyyymm')='201502' -- February month (t+1)      
                        )

    
;   

--- Consolidating data from month t with month t plus one from the temporary table created prevIoUsly
        
        SELECT
                         a.product -- Company products,to_char(a.pe_produc,'yyyymm') AS codmonth --Month of  production,(CASE
                        WHEN a.co_diamorcro <= 0 THEN '0 dpd'
                        WHEN a.co_diamorcro > 0 AND a.co_diamorcro <= 8 THEN '1-8 dpd'
                        WHEN a.co_diamorcro > 8 AND a.co_diamorcro <= 30 THEN '9-30 dpd'
                        WHEN a.co_diamorcro > 30 AND a.co_diamorcro <= 60 THEN '31-60 dpd'
                        WHEN a.co_diamorcro > 60 AND a.co_diamorcro <= 120 THEN '61-120 dpd'
                        WHEN a.co_diamorcro > 120  then '>120 dpd' 
                        ELSE 'Refinanced and canceled' END ) AS rolls_rate_t --Rolls rate(paydays) category in month t (January),(CASE
                         WHEN b.rolls_rate_axes_t_mas_1 IS null THEN 'Refinanced and canceled'
                         ELSE b.rolls_rate_axes_t_mas_1 END) AS rolls_rate_t_plus_1 --Rolls rate category in month t plus 1  (February),COUNT(a.co_contra) AS nro_credit -- nro of credits of month t (January),SUM(a.im_salact) AS amount_credit -- amount of credits of month t (January)
FROM risk.portfolio_wfcore a
LEFT JOIN  
rolls_rate_t_plus_1  b
ON a.co_contra = b.co_contra
WHERE
a.pe_produc= (date_trunc('month',a.pe_produc + interval '1 month' - interval '1 day')::date -1)  -- Last day of the month
AND to_char(a.pe_produc,'yyyymm')='201501' -- January month (t)
GROUP BY 1,2,3,4,5,6
ORDER BY 1,2

结果:

产品 codmonth rolls_rate_axes_t rolls_rate_t_plus_1 nro_credit_t amount_credit_t
201501 31-60 dpd 61-90 dpd 2 247.59
201501 61-90 dpd 再融资和取消 3 2388.56
201501 61-90 dpd 31-60 dpd 26 54251.75

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。