#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)