2015-08-03 3 views
0

Я пытаюсь выяснить, как заполнить следующие значения NULL с помощью 1.245 для дат от 07-OCT-14 до 29-SEP-14, затем от 26-SEP-14 до 28-JUL-14 будет 1.447.SQL Query self query

Это означает, что если дата меньше или равна указанной даты, то используйте значение максимальной даты вступления в силу, которая меньше указанной даты

Мы могли бы выбрать последнюю доступную index_ratio значение для заданных security_alias и эффективной date < = p.effective_date, поэтому, другими словами, нам нужно будет изменить sql, чтобы вернуть из подзапроса значение индекса, определенное для максимальной доступной даты вступления в силу, если эта эффективная дата меньше или равна дате вступления в силу

Как заполнить значение?

select ab.security_alias, 
ab.index_ratio, 
ab.effective_date 
from securitydbo.security_analytics_fi ab 
where ab.security_alias = 123627 
order by ab.effective_date desc 

enter image description here

Ниже следует быть выходным

enter image description here

+0

Непонятно, что представляет собой вход и ожидаемые результаты. – Bulat

+0

Непонятно, что означают следующие значения NULL: – fantaghirocco

ответ

0

Предполагая, что я понимаю ваши требования правильно, я думаю, что аналитическая функция LAST_VALUE() является то, что вы после этого. Например:

with sample_data as (select 1 id, 10 val, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('02/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('03/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('04/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, 20 val, to_date('05/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, 21 val, to_date('06/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('07/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('08/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, 31 val, to_date('09/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, null val, to_date('10/08/2015', 'dd/mm/yyyy') dt from dual union all 
        select 1 id, 42 val, to_date('11/08/2015', 'dd/mm/yyyy') dt from dual) 
select id, 
     last_value(val ignore nulls) over (partition by id order by dt) val, 
     dt 
from sample_data 
order by id, dt desc; 

     ID  VAL DT   
---------- ---------- ---------- 
     1   42 11/08/2015 
     1   31 10/08/2015 
     1   31 09/08/2015 
     1   21 08/08/2015 
     1   21 07/08/2015 
     1   21 06/08/2015 
     1   20 05/08/2015 
     1   10 04/08/2015 
     1   10 03/08/2015 
     1   10 02/08/2015 
     1   10 01/08/2015