【发布时间】:2016-11-07 14:36:11
【问题描述】:
背景
我有一个包含交易的表格。有两种类型的事务:“正常条目”(type=N)和“修复”条目(type=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 答案也将被接受!
【问题讨论】:
-
游标在 SAS SQL 中可用。
-
您是否可以假设您提供的订单将会存在,或者是否也需要将其考虑到解决方案中?
-
是的,可以假定行顺序是这样的。感谢光标的东西,我不知道。