Столбец для вывода разницы показателей прошлого периода и текущего

Сравнение метрики с показателем за предыдущий период.

Эту задачу можно реализовать, написав запрос определенного вида.

Он будет включать в себя следующие показатели:
t1 – таблица, содержащая исходные данные
m1 – метрика, которую необходимо сравнить
p1 – дата, по которой должно быть смещение по времени
d1, d2, d3 – набор характеристик (дименшенов)

В исходном виде запрос к данным делается таким образом:

Select p1, d1, d2, d3, m1 From t1

Заметим, что если к дате p1 добавить интервал 1 месяц, то при фильтрации данных по определенному периоду мы будем видеть данные, которые реально относятся к предыдущему месяцу. Поэтому для обращения к предыдущему месяцу добавим дополнительное поле m1_prev. запрос будет выглядеть так:

Select p1 + interval ‘1 month’, d1, d2, d3, m1_prev From t1

То есть в этом запросе при обращении к дате первое марта, мы будем видеть данные за первое февраля (1.02 + интервал 1 месяц = 1.03). Если у нас максимальная дата как раз первое марта, то она преобразуется в первое апреля, и у нас появятся будущие периоды. Для того, чтобы не получить в итоговой таблице будущие периоды, нам нужно исключить из этой части выборки последний месяц.

With t2 as (Select max(p1) max_p1 From t1)
Select p1 + interval ‘1 month’, d1, d2, d3, m1_prev From t1
Where p1 <= (select max_p1 - interval ‘1 month’ From t2)

Чтобы объединить эти два запроса нам нужно оба значения этой метрики разнести в разные поля.

With t2 as (select max(p1) max_p1 From t1)
Select p1, d1, d2, d3, m1, null as m1_prev From t1
Union all
Select p1 + interval ‘1 month’, d1, d2, d3, null as m1, m1_prev from t1 where p1 <= (select max_p1 - interval ‘1 month’ From t2)

Таким образом на выходе получим таблицу с двумя метриками m1 и m1_prev, которые можно агрегировать любыми функциями.
Для ускорения работы можно дополнить каждую часть выборки фильтрацией по всем полям, кроме p1 и добавить общий фильтр на p1.

With t2 as (select max(p1) max_p1 from t1)
Select * From (
Select p1, d1, d2, d3, m1, null as m1_prev From t1 Where ${filters(except(p1))}
Union all
Select p1 + interval ‘1 month’, d1, d2, d3, null as m1, m1_prev From t1 Where p1 <= (select max_p1 - interval ‘1 month’ from t2) and ${filters(except(p1))}
) Where ${filters(p1)}