Oracle分析功能

Bal*_*ala 2 oracle function analytical

我有类似的问题.你能有人给我解决方案吗?下面是表值

    10    
    20    
    30   
    40
Run Code Online (Sandbox Code Playgroud)

我想要像这样的输出

10  10-2     8    
20  20-8    12    
30  30-12   18    
40  40-18   22   
Run Code Online (Sandbox Code Playgroud)

按升序排序,并始终为第一个recrod减去2,并将结果用于后续记录.

MT0*_*MT0 6

SQL小提琴

Oracle 11g R2架构设置:

CREATE TABLE TEST ( VAL ) AS
          SELECT 10 FROM DUAL
UNION ALL SELECT 20 FROM DUAL
UNION ALL SELECT 30 FROM DUAL
UNION ALL SELECT 40 FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

查询1:

WITH Parities AS (
  SELECT VAL,
         MOD( ROW_NUMBER() OVER ( ORDER BY VAL ), 2 ) AS Parity
  FROM   TEST
)
SELECT VAL,
       ABS( SUM( CASE PARITY WHEN 1 THEN -VAL ELSE VAL END ) OVER ( ORDER BY VAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) + 2 ) AS total
FROM   Parities
Run Code Online (Sandbox Code Playgroud)

结果:

| VAL | TOTAL |
|-----|-------|
|  10 |     8 |
|  20 |    12 |
|  30 |    18 |
|  40 |    22 |
Run Code Online (Sandbox Code Playgroud)