rows between
Когда я в декабре решала Advent of SQL, на 11 день было интересное задание - найти скользящее среднее по текущей строке с двумя предыдущими. Еще похожая штука применяется, когда нужно найти кумулятивную сумму
Выход - оконка! (но только в целях SQL)
Мы можем написать так:
avg(amount) over(order by column)
Но под капотом это так:
avg(amount) over(order by column rows between unbounded preceding and current row)
т.е. мы стартуем с первой строки и берем все до текущей
Всего есть несколько способов тюнинга:
--от первой до текущей
rows between unbounded preceding and current row
--от текущей до последней
rows between current row and unbounded following
--с конкретикой - сколько до и сколько после
--от предыдущей до текущей (2 строки)
rows between 1 preceding and current row
--от текущей до 1 следующей (2 строки)
rows between current row and 1 following
--от предыдущей до следующей (3 строки, еще текущая есть)
rows between 1 preceding and 1 following
В контексте задачи со скользящим средним просто нужно взять не 1, а 2 строки:
avg(amount) over(order by rows between 2 preceding and current row)
А для кумулятивной суммы нужно просто сделать так, потому что по дефолту она и будет кумулятивной
sum(amount) over(order by column)
Обсуждение 48
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram