Сравните изменения по строкам в Oracle, используя только SQl - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть такая таблица,

ID Quarter Risk 00001 Q0 2
00001 Q1 3
00001 Q2 1
00001 Q3 1
00001 Q4 2

1 means Lower Risk and 3 means Higher RiskQ0 means 4th Quarter of previous year.

Мне нужен такой вывод:

ID Quarter Risk Status 00001 Q0 2 null
00001 Q1 3 Upgraded
00001 Q2 1 Downgraded
00001 Q3 1 No Change
00001 Q4 2 Upgraded

Если Риск больше, чем в предыдущем квартале, то он Повышен , а в противном случае Понижен .Если значение остается тем же, то Без изменений .

Я хочу добиться этого, используя только SQL в Oracle 10G.Я не могу использовать PL / SQL .

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

То же самое может быть достигнуто с помощью функции задержки, которая доступна в Oracle 10g.

select id
      ,quarter
      ,risk
      ,case when risk - lag(risk) over(order by quarter) <0 then 
                 'Downgraded'
            when risk - lag(risk) over(order by quarter) =0 then 
                 'No change'
            when risk - lag(risk) over(order by quarter) >0 then 
                 'Upgraded'
       end as status 
  from table
0 голосов
/ 29 ноября 2018

Вы можете использовать lag():

select t.*,
       (case when Risk > prev_rsk
             then 'Upgraded'
             when Risk < prev_rsk
             then 'Downgraded'
             when Risk = prev_rsk
             then 'No Change'
        end) as Status
from (select t.*,
             lag(Risk) over (partition by id order by Quarter) as prev_rsk
      from table t
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...