Группируйте повторяющиеся предложения вместе в Postgres

#sql #postgresql #window-functions

#sql #postgresql #оконные функции

Вопрос:

Возможно ли каким-либо образом объединить несколько повторяющихся OVER предложений вместе в Postgres?

Пример со CASE ... END сценарием:

    case
        when hhk = lag(hhk) over (order by hhk, product, dt)
        and product = lag(product) over (order by hhk, product, dt)
        then dt - lag(dt) over (order by hhk, product, dt)
        else null
    end as delta
  

Предложение over (order by hhk, product, dt) повторяется три раза. Я ищу способ каким-то образом сгруппировать их вместе, например, следующим образом (который, конечно, не работает как таковой):

     case
        -- here we combine the two conditions into one
        when [hhk, product] = lag([hhk, product]) 
            over (order by hhk, product, dt)
        -- and here we somehow recall the clause
        then dt - lag(dt) over (my_clause)
        else null
    end as delta
  

Ответ №1:

Вы можете определить окно в FROM предложении. Например:

 select v.*, row_number() over w
from (values (1, 2), (1, 3)) v(x, y)
     window w as (partition by x order by y)
  

В вашем конкретном примере я могу предположить что-то вроде этого:

 select . . .
       (case when household_key = lag(household_key) over w and
                  product_id = lag(product_id) over w
        then dt - lag(dt) over w
        end) as delta
from . . .
     window w as (order by household_key, product_id, dt)