Oracle从值中选择并从上一个值中减去

时间:2018-04-20 11:53:18

标签: oracle select

需要有关Oracle SELECT声明的帮助。 我有这样的表用过的日子。用户可以有11天

+----+----------+-----+-----------+
| ID | NAME     | USED| DATE      |
+----+----------+-----+-----------+ 
|  1 | John     |  1  |01/01/2018 |
|  2 | John     |  2  |01/03/2018 |
|  3 | John     |  2  |01/05/2018 |
+----+----------+-----+-----------+

所以在QUERY SELECT我希望得到像这样的左天结果

+----+----------+------+-----------+
| ID | NAME     | DAYS | USED| LEFT| 
+----+----------+------+-----------+ 
|  1 | John     |  11  |  1  |  10 | 
|  2 | John     |  10  |  2  |  8  | 
|  3 | John     |  8   |  2  |  6  | 
+----+----------+------+-----------+

如何实现这一结果的任何帮助?

1 个答案:

答案 0 :(得分:0)

您需要的主要是sum的分析版本。另外,尽量不要使用Oracle关键字(如date)作为列名。

-- sample data
with ex as (select 1 as id, 'John' as name, 1 as used, to_date('01/01/2018','mm/dd/yyyy') as date1 from dual
            union select 2 as id, 'John' as name, 2 as used, to_date('01/03/2018','mm/dd/yyyy') from dual
            union select 3 as id, 'John' as name, 2 as used, to_date('01/05/2018','mm/dd/yyyy') from dual)
-- main query
select id, 
    name, 
    11-sum(used) over (partition by name order by date1) + used as days, 
    used, 
    11-sum(used) over (partition by name order by date1) as left
from ex;

输出:

        ID NAME       DAYS       USED       LEFT
---------- ---- ---------- ---------- ----------
         1 John         11          1         10
         2 John         10          2          8
         3 John          8          2          6