PL / SQL Oracle 11g循环

时间:2016-05-09 14:57:06

标签: oracle oracle11g

我无法解决问题。我想每次我们的数据仓库中的帐户发生变更时都会收到记录,但我只收到一个。下表是我正在使用的样本。

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.我的问题是计算每天的实际重发次数。

1 个答案:

答案 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。然后从当前行的值中减去该值以获得差异。