SQL中的LEAD函數,在數據分析中有什麼作用?

Vintage分析

Vintage分析用到信貸資產行業,指的是每個月貸款的資產質量情況,要直接跟每個相同時間段內的餘額做比較。注意這裏比較有個前提,就是比較的事物應該是位於同一層面上的,不能將不同賬齡的放款質量進行對比,要按賬齡(month of book,MOB)的長短同步對比,從而瞭解同一產品不同時期放款的資產質量情況。Vintage分析方法能很好地解決時滯性問題,其核心思想是對不同時期的開戶的資產進行分別跟蹤,按照賬齡的長短進行同步對比,從而瞭解不同時期發行信用卡的資產質量情況。

需求描述

Vintage分析目前被廣泛應用於信用卡產業。舉例說明根據賬齡所做的拖欠二週期賬戶的Vintage分析,原始數據見表1:

第一行數據意思是:數據2.12%爲2018年4月所發信用卡在2018年7月時拖欠二週期的金額除以該批信用卡在2018年7月時透支餘額,依此類推,得到全表的數據。在此基礎上,按照賬齡爲經營時間減去髮卡時間進行表間數據的轉換,得到MOB,得到表2:

通過vintage報表,可以看出,不同月份的髮卡賬戶的同一mob下的拖欠率的變化情況。

這裏我們的需求是:怎麼將表1格式的數據轉換成表2格式的數據?

需求實現

插入數據

同樣這裏假定已經存在表WN_table,含有date_faka、date_mob、overduerate這3個字段:

insert into WN_table values('2018-04', '2018-07', '2.12');
insert into WN_table values('2018-04', '2018-08', '2.19');
insert into WN_table values('2018-04', '2018-09', '3.1 ');
insert into WN_table values('2018-04', '2018-10', '2.58');
insert into WN_table values('2018-04', '2018-11', '2.65');
insert into WN_table values('2018-04', '2018-12', '2.84');
insert into WN_table values('2018-05', '2018-08', '2.47');
insert into WN_table values('2018-05', '2018-09', '2.52');
insert into WN_table values('2018-05', '2018-10', '2.53');
insert into WN_table values('2018-05', '2018-11', '2.52');
insert into WN_table values('2018-05', '2018-12', '2.49');
insert into WN_table values('2018-06', '2018-09', '1.63');
insert into WN_table values('2018-06', '2018-10', '1.88');
insert into WN_table values('2018-06', '2018-11', '1.87');
insert into WN_table values('2018-06', '2018-12', '2.1 ');
insert into WN_table values('2018-07', '2018-10', '3.32');
insert into WN_table values('2018-07', '2018-11', '3.88');
insert into WN_table values('2018-07', '2018-12', '3.46');
insert into WN_table values('2018-08', '2018-11', '2.37');
insert into WN_table values('2018-08', '2018-12', '1.46');
insert into WN_table values('2018-09', '2018-12', '2.51');
(提示:可以左右滑動代碼)

Vintage報表

這裏我們仍然使用LEAD窗口函數實現我們的需求:

如果對LEAD函數使用有疑問的朋友,可以先閱讀LEAD函數的具體介紹:

select
date_faka, M3,M4, M5, M6, M7, M8
from
(
select date_faka, overduerate M3,
lead(overduerate,1) over(partition by date_faka order by date_mob) M4,
lead(overduerate,2) over(partition by date_faka order by date_mob) M5,
lead(overduerate,3) over(partition by date_faka order by date_mob) M6,
lead(overduerate,4) over(partition by date_faka order by date_mob) M7,
lead(overduerate,5) over(partition by date_faka order by date_mob) M8,
row_number() over(partition by date_faka order by date_mob) row_num
from WN_table
) t
where row_num = 1

得到vintage報表:

當然,也可以不將NULL呈現出來:

select
date_faka,
case when M3 is null then '' else M3 end M3,
case when M4 is null then '' else M3 end M4,
case when M5 is null then '' else M3 end M5,
case when M6 is null then '' else M3 end M6,
case when M7 is null then '' else M3 end M7,
case when M8 is null then '' else M3 end M8
from
(
select date_faka, overduerate M3,
lead(overduerate,1) over(partition by date_faka order by date_mob) M4,
lead(overduerate,2) over(partition by date_faka order by date_mob) M5,
lead(overduerate,3) over(partition by date_faka order by date_mob) M6,
lead(overduerate,4) over(partition by date_faka order by date_mob) M7,
lead(overduerate,5) over(partition by date_faka order by date_mob) M8,
row_number() over(partition by date_faka order by date_mob) row_num
from WN_table
) t
where row_num = 1

總結

這裏我們使用窗口函數製作了vintage報表,也可以使用相同的代碼製作客戶留存率等,例如商城不同月份註冊客戶在不同mob下的留存率等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章