2015-04-30 2 views
0

Я относительно новичок в PostgreSQL, и мне сложно выполнить функцию lag() при игнорировании нулевых значений. Согласно документам, http://www.postgresql.org/docs/9.4/static/functions-window.html, невозможно просто передать параметр функции для достижения этого.Функции окна PostgreSQL Игнорировать нулевые значения

Кто-нибудь знает об обходном пути? Вы можете составить любой пример, но если это помогает здесь что-то, чтобы вы начали:

Col_A Col_B Col_A_Lag Col_B_Lag ID Date 
VA_1 100 VA_1  100  AA Jan-1 
null null VA_1  100  AA Jan-2 
null null VA_1  100  AA Jan-3 
VA_2 250 VA_2  250  AA Jan-4 
VA_2 300 VA_2  300  AA Jan-5 
null null VA_2  300  AA Jan-6 

Если я вытягивать из tbl_x, вот простой SQL скрипт:

select 
Col_A, 
Col_B, 
case when Col_A is null then lag(Col_A) over w else Col_A end as Col_A_Lag, 
case when Col_B is null then lag(Col_B) over w else Col_B end as Col_B_Lag 
from tbl_x 
window w as (partition by ID order by Date) 

Этот сценарий будет не вернуть то, что я хочу, потому что он включает в себя нулевые значения, когда он «оглядывается» в лаг.

Заранее спасибо.

ответ

1

Я полагаю, что вы не можете просто:

select 
from tbl_x 
window w as (partition by ID order by Date) 
where col_a is null; 

Если нет, то вы, возможно, придется:

select 
Col_A, 
Col_B, 
case when Col_A is null 
    then (select col_a 
      from tbl_x x2 
     where x2.id = x1.id 
      and col_a is not null 
      and x2.date < x1.date 
     order by date desc 
     limit 1) 
    else Col_A 
    end Col_A_Lag, 
case when Col_B is null 
    then (select col_b 
      from tbl_x x2 
     where x2.id = x1.id 
      and col_b is not null 
      and x2.date < x1.date 
     order by date desc 
     limit 1) 
    else Col_B 
    end Col_B_Lag 
from tbl_x x1; 

При соответствующей индексации производительности, вероятно, будет очень хорошо.

create index ... (id, date desc, col_b) where col_b is not null; 
+0

Я ценю ваш ответ, но ваше второе решение не работает при изменении Col_A. Я либо получаю все значения VA_1, либо значения VA_2 в Col_A_Lag в зависимости от того, как я сортирую дату. – bsheehy

+0

А не заметил эту логику. Отредактировал запрос, чтобы включить его. –

+0

Ближе ... все нулевые значения заполняются VA_1 .... последним должен быть VA_2. Благодарю. – bsheehy

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