最近 5 笔特定交易的数量
Number of specific transactions in the last 5 trns
我想写sas代码(proc-sql)。问题是如何创建变量 VP_Trans(在下面的 table 中)。下面的table是指客户在一段时间内的交易。
我想根据客户最近的 5 笔交易计算出他有多少 VP 交易。包括第 5 笔交易
例如客户 1 有 5 个 VP 交易从 1.2.-11.2 之间发生的交易计算得出。
+---------+-------------+-----------+----------+
| cust id | Trans Dates | TransType | Vp_Trans |
+---------+-------------+-----------+----------+
| 1 | 2015-02-01 | VP | NA |
| 1 | 2015-02-03 | Vp | NA |
| 1 | 2015-02-06 | VP | NA |
| 1 | 2015-02-06 | Vp | NA |
| 1 | 2015-02-11 | Vp | 5 |
| 1 | 2015-02-13 | MG | 4 |
| 1 | 2015-02-17 | Vp | 4 |
| 1 | 2015-02-18 | mg | 3 |
| 1 | 2015-02-19 | mg | 2 |
| 1 | 2015-02-20 | mg | 1 |
| 1 | 2015-02-21 | vp | 2 |
| 2 | 2015-02-01 | VP | NA |
| 2 | 2015-02-03 | mg | NA |
| 2 | 2015-02-06 | mg | NA |
| 2 | 2015-02-06 | Vp | NA |
| 2 | 2015-02-11 | Vp | 3 |
| 2 | 2015-02-13 | MG | 2 |
| 2 | 2015-02-17 | Vp | 3 |
| 2 | 2015-02-18 | mg | 3 |
| 2 | 2015-02-19 | mg | 2 |
| 2 | 2015-02-20 | mg | 1 |
| 2 | 2015-02-21 | mg | 1 |
| 2 | 2015-02-22 | mg | 0 |
+---------+-------------+-----------+----------+
如果您的 DBMS 支持窗口化聚合,它就是一个简单的移动计数:
select
cust_id, Trans_Dates, TransType,
count(case when TransType = 'VP' then 1 end)
over (partition bycust_id
order by Trans_Dates
rows 4 preceding) as Vp_Trans
from tab
使用 5 元素数组来跟踪对 type='VP' 的检查。使用 MOD()
函数实现环绕索引。这是您的示例数据:
data have ;
input id Date Type $ Expected ;
informat date yymmdd10.;
format date yymmdd10.;
cards;
1 2015-02-01 VP .
1 2015-02-03 Vp .
1 2015-02-06 VP .
1 2015-02-06 Vp .
1 2015-02-11 Vp 5
1 2015-02-13 MG 4
1 2015-02-17 Vp 4
1 2015-02-18 mg 3
1 2015-02-19 mg 2
1 2015-02-20 mg 1
1 2015-02-21 vp 2
2 2015-02-01 VP .
2 2015-02-03 mg .
2 2015-02-06 mg .
2 2015-02-06 Vp .
2 2015-02-11 Vp 3
2 2015-02-13 MG 2
2 2015-02-17 Vp 3
2 2015-02-18 mg 3
2 2015-02-19 mg 2
2 2015-02-20 mg 1
2 2015-02-21 mg 1
2 2015-02-22 mg 0
;;;;
这里是计算VP_TRANS的数据步骤。
data want ;
do n=1 by 1 until (last.id);
set have ;
by id date ;
array flags (5) ;
flags(mod(n,5)+1)= upcase(type)='VP';
if n>= 5 then VP_trans=sum(of flags(*));
output;
end;
drop flags: ;
run;
proc print; run;
我想写sas代码(proc-sql)。问题是如何创建变量 VP_Trans(在下面的 table 中)。下面的table是指客户在一段时间内的交易。 我想根据客户最近的 5 笔交易计算出他有多少 VP 交易。包括第 5 笔交易 例如客户 1 有 5 个 VP 交易从 1.2.-11.2 之间发生的交易计算得出。
+---------+-------------+-----------+----------+
| cust id | Trans Dates | TransType | Vp_Trans |
+---------+-------------+-----------+----------+
| 1 | 2015-02-01 | VP | NA |
| 1 | 2015-02-03 | Vp | NA |
| 1 | 2015-02-06 | VP | NA |
| 1 | 2015-02-06 | Vp | NA |
| 1 | 2015-02-11 | Vp | 5 |
| 1 | 2015-02-13 | MG | 4 |
| 1 | 2015-02-17 | Vp | 4 |
| 1 | 2015-02-18 | mg | 3 |
| 1 | 2015-02-19 | mg | 2 |
| 1 | 2015-02-20 | mg | 1 |
| 1 | 2015-02-21 | vp | 2 |
| 2 | 2015-02-01 | VP | NA |
| 2 | 2015-02-03 | mg | NA |
| 2 | 2015-02-06 | mg | NA |
| 2 | 2015-02-06 | Vp | NA |
| 2 | 2015-02-11 | Vp | 3 |
| 2 | 2015-02-13 | MG | 2 |
| 2 | 2015-02-17 | Vp | 3 |
| 2 | 2015-02-18 | mg | 3 |
| 2 | 2015-02-19 | mg | 2 |
| 2 | 2015-02-20 | mg | 1 |
| 2 | 2015-02-21 | mg | 1 |
| 2 | 2015-02-22 | mg | 0 |
+---------+-------------+-----------+----------+
如果您的 DBMS 支持窗口化聚合,它就是一个简单的移动计数:
select
cust_id, Trans_Dates, TransType,
count(case when TransType = 'VP' then 1 end)
over (partition bycust_id
order by Trans_Dates
rows 4 preceding) as Vp_Trans
from tab
使用 5 元素数组来跟踪对 type='VP' 的检查。使用 MOD()
函数实现环绕索引。这是您的示例数据:
data have ;
input id Date Type $ Expected ;
informat date yymmdd10.;
format date yymmdd10.;
cards;
1 2015-02-01 VP .
1 2015-02-03 Vp .
1 2015-02-06 VP .
1 2015-02-06 Vp .
1 2015-02-11 Vp 5
1 2015-02-13 MG 4
1 2015-02-17 Vp 4
1 2015-02-18 mg 3
1 2015-02-19 mg 2
1 2015-02-20 mg 1
1 2015-02-21 vp 2
2 2015-02-01 VP .
2 2015-02-03 mg .
2 2015-02-06 mg .
2 2015-02-06 Vp .
2 2015-02-11 Vp 3
2 2015-02-13 MG 2
2 2015-02-17 Vp 3
2 2015-02-18 mg 3
2 2015-02-19 mg 2
2 2015-02-20 mg 1
2 2015-02-21 mg 1
2 2015-02-22 mg 0
;;;;
这里是计算VP_TRANS的数据步骤。
data want ;
do n=1 by 1 until (last.id);
set have ;
by id date ;
array flags (5) ;
flags(mod(n,5)+1)= upcase(type)='VP';
if n>= 5 then VP_trans=sum(of flags(*));
output;
end;
drop flags: ;
run;
proc print; run;