2013-10-15 2 views
0

У меня есть две таблицы, примеры ниже.SQL Oracle - использование RowNum в запросе

table_1 
days  special_day 
10/09/2013  Y 
10/10/2013  N 
10/11/2013  Y 
10/12/2013  N 
10/13/2013  N 
10/14/2013  Y 

table_2 
id   special_day_ind  numdays   order 
123   Y     3    2 
456   N     5    1 

Мой запрос должен выбрать разность между sysday и правильной датой от table_1 на основе параметров в table_2. Если special_day_ind - «Y», мне нужно 3 (numdays) special_days обратно из sysdate. Если «N», число - это ответ. Результатом будет ORDER (ed) BY order asc (окончание).

В приведенном выше примере таблицы запрос вернется назад.

SYSDATE = 10/14/2013

id  days 
456  5 
123  5 (10/14/2013 - 10/9/2013) 

Похоже, что ROWNUM будет делать трюк, однако с различающимися «способами» подсчета, я не уверен, как поступить.

+0

Думаю, вам нужно изучить [аналитические функции] (http://www.oracle-base.com/articles/misc/lag-lead-analytic-functions.php). –

ответ

0

Вот как это сделать.

Вам необходимо присвоить номер строки специальным дням в таблице_1.

select days, 
     row_number() over (order by days desc) r 
    from table_1 
where special_day = 'Y'; 

Используя это как CTE, вы можете найти более ранние специальные дни и вычесть его из sysdate.

with x as(
    select days, 
     row_number() over (order by days desc) r 
    from table_1 
    where special_day = 'Y' 
) 
select id, 
     case when special_day_ind = 'N' 
      then numdays 
      when special_day_ind = 'Y' 
      then trunc(sysdate) - (select days 
            from x 
            where r = numdays) 
     end days 
    from table_2 
order by order_; 

Demo.

Смежные вопросы