Аналитическая функция Oracle

У меня похожая проблема. Можете ли вы кто-нибудь дать мне решение. Ниже приведено табличное значение

    10    
    20    
    30   
    40

Я хочу вывод, как это

10  10-2     8    
20  20-8    12    
30  30-12   18    
40  40-18   22   

Сортируйте по возрастанию и всегда вычитайте 2 для первой записи и используйте результат для последующих записей.

2 ответа

SQL Fiddle

Настройка схемы 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;

Запрос 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

Результаты:

| VAL | TOTAL |
|-----|-------|
|  10 |     8 |
|  20 |    12 |
|  30 |    18 |
|  40 |    22 |

Для полноты - базовое рекурсивное решение:

SQLFiddle

with t(val, n) as (
  select val, val-2 from test where val = 10
  union all select test.val, test.val-n from test, t where test.val = t.val + 10 )
select * from t
Другие вопросы по тегам