Oracle / Sql запрос для некоторых расчетов! - PullRequest
1 голос
/ 29 июля 2011

Я хочу задать один вопрос о oracle / sql query.

У меня есть некоторые данные, как показано ниже,

   Column1
     25
     20
     15
     12
     11
     10

Я хочу получить такой результат,

   Column1
     5        (25-20)
     5        (20-15)   
     3        (15-12) 
     1        (12-11)
     1        (11-10)

Я использую курсор для получения этих результатов. Но я не очень хочу использовать курсор, потому что у меня так много строк для вычисления. Есть ли какая-либо функция для получения таких результатов в Oracle / Sql, как "Case When, Roll Up".

1 Ответ

9 голосов
/ 29 июля 2011

Этими функциями являются lag () и lead (), см. Здесь - http://www.orafaq.com/node/55

Они могут использоваться следующим образом -

select 
  value - prev_value as diff,
  '(' || to_char(value) || ' - ' || to_char(prev_value) || ')' as expression
from (  
select value, idx, 
  lag(value) over (order by idx) as next_value,
  lead(value) over (order by idx) as prev_value
from(
          select 25 as value, 1 as idx from dual
union all select 20 as value, 2 as idx from dual
union all select 15 as value, 3 as idx from dual
union all select 12 as value, 4 as idx from dual
union all select 11 as value, 5 as idx from dual
union all select 10 as value, 6 as idx from dual
)
) where prev_value is not null
...