我无法解决问题。我想每次我们的数据仓库中的帐户发生变更时都会收到记录,但我只收到一个。下表是我正在使用的样本。
Row Acct1 Acct2 Date Total_Reissued Reissue_Per_Day
1 A 1 1/1/2016 2 2
2 A 1 1/2/2016 3 1
3 A 1 1/3/2016 5 2
4 A 1 1/4/2016 6 1
1 B 3 1/1/2016 1 1
2 B 3 1/2/2016 2 1
1 B 4 1/1/2016 1 1
2 B 4 1/2/2016 2 1
重新发布的专栏是一个总计。对于2016年1月1日的Acct A,有2次重新发行,然后在2016年1月1日还有1次再次进行3.我的问题是计算每天的实际重发次数。
答案 0 :(得分:2)
您可以使用the lag()
function查看上一行;假设'previous'是您在acct1 / acct2组合中看到的最后日期,您可以这样做:
select row_number() over (partition by acct1, acct2 order by dt) as row_num,
acct1, acct2, dt, total_reissued,
total_reissued - nvl(lag(total_reissued)
over (partition by acct1, acct2 order by dt), 0) as reissue_per_day
from your_table;
ROW_NUM A ACCT2 DT TOTAL_REISSUED REISSUE_PER_DAY
---------- - ---------- ---------- -------------- ---------------
1 A 1 2016-01-01 2 2
2 A 1 2016-01-02 3 1
3 A 1 2016-01-03 5 2
4 A 1 2016-01-04 6 1
1 B 3 2016-01-01 1 1
2 B 3 2016-01-02 2 1
1 B 4 2016-01-01 1 1
2 B 4 2016-01-02 2 1
我不确定您的“行”列是否确实存在,或者是否是必需的,或者只是为了说明您的数据。无论如何,我已经生成了它,万一你需要它。
感兴趣的主要是:
lag(total_reissued) over (partition by acct1, acct2 order by dt)
找到上一个日期的值(使用dt
作为列名,因为date
不是有效名称)。然后它有一个nvl()
包装器,因此第一行看到虚拟值为零而不是null。然后从当前行的值中减去该值以获得差异。