PL / SQL Oracle 11g循环

约瑟夫·佩鲁夫(Joseph Peluf)

我无法解决。我想每次数据仓库中的帐户发生更改时都会得到一条记录,但是我只收到一个记录。下表是我正在使用的示例。

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日的帐户A,有2次重发,然后在2016年1月2日,有1次重发,总计3次。我的问题是计算每天的实际重发次数。

亚历克斯·普尔

您可以使用lag()功能来回溯上一行;假设“上一个”是您看到的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。然后从当前行的值中减去该值以获得差值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章