背景
我有一个包含交易的表格。有两种类型的事务:“正常条目”(类型= N)和“修复”条目(类型= F)。每笔交易都有客户ID,日期,类型代码和欧元金额。一些示例数据如下:
| client_id | date | transaction_type | amount |
|-----------|-----------|------------------|---------|
| 111 | 01jan2015 | N | 1000.0 |
| 111 | 01jan2015 | F | -500.0 |
| 222 | 05mar2015 | N | 2000.0 |
| 222 | 06mar2015 | F | -100.0 |
| 222 | 07mar2015 | F | -100.0 |
| 222 | 09mar2015 | N | 1000.0 |
| 222 | 10mar2015 | N | 400.0 |
| 222 | 15jun2015 | F | -200.0 |
修正条目是对登记处某人进行的正常交易的人工更正。它们可以在同一天或正常交易之后完成,但如果为同一客户输入新的正常交易,则所有该客户的连续修复都涉及新交易(直到输入另一个正常交易)。因此,实际上,所有修复程序仅“修复”该客户端的最新事务。
修正可以是正数或负数,正常交易只是正数。
所需的输出
我想要的是每个客户的一组“正常”交易,其金额由与该交易相关的所有修正更正。以下示例数据:
| client_id | date | amount |
|-----------|-----------|--------|
| 111 | 01jan2015 | 500.0 |
| 222 | 05mar2015 | 1800.0 |
| 222 | 07mar2015 | 1000.0 |
| 222 | 08mar2015 | 200.0 |
所以这是一个N类交易和所有连续F交易的总和,直到下一个N交易。
到目前为止我有什么
如果所有修复都发生在与原始交易相同的日期(通常就是这种情况),这很简单:
select client_id, date, sum(amount)
from transaction_table
group by client_id, date
但是,我在处理原始交易日期之后发生的修复时遇到问题,因为我只需要选择在下一次正常交易之前发生的修复(这需要申请每个正常交易)。
有关正在使用的产品的说明
我实际上正在使用SAS 9.4,但通过SAS的proc sql程序,我可以应用基本的SQL,这就是我更习惯使用的。没什么好看的(因此游标,CTE等都没有)。一个不错的SAS答案也将被接受!
答案 0 :(得分:0)
创建一个每N设置的分组标志。 如果同一天有多次购买会怎样?
Data want;
Set have;
By ID;
Retain purchaseGroup;
If transx = 'N' then purchaseGroup+1;
If first.id then purchaseGroup=1;
Run;
然后使用ID和PurchaseGroup的SQL步骤分组进行汇总。