Содержание

Предисловие

Многие наверно уже слышали про AsOfCalendar, кто-то пропустил мимо, кто-то разобрался, я же предлагаю разложить это по полочкам чтобы не было ни у кого больше вопросов

Скрипт

Скрипт я взял на просторах небъятной паутины и добавил комментарии, можете его смело брать, вставлять в своё приложение и запускать загрузку данных

В переменнных vMin и vMax можете использовать любые значения

asof.qvs

// Определим начальный и конечный период для генерации дат
let vMin = num(MakeDate(2015));
let vMax = num(MakeDate(2022));

// Создаем таблицу всех дат в заданном диапазоне
Temp:
Load
	Date($(vMin) + RowNo() - 1) as Date
Autogenerate 1
While
    Date($(vMin) + RowNo() - 1 ) < Date($(vMax));
    
// Создаем таблицу с месяцами
Month:
LOAD Distinct
	Date(MonthStart(Date)) as Month
Resident Temp;

// Присоединяем месяцы к месяцам
Join(Month)
LOAD
	Date(MonthStart(Date)) as AsOfMonth
Resident Temp;

// Создаем календарь со смещениями
AsOfCalendar:
Load
	Month
    , AsOfMonth
    , Round( ( AsOfMonth - Month ) * 12 / 365.2425 ) as MonthDiff
    , Year ( AsOfMonth ) - Year ( Month ) as YearDiff
Resident Month
Where
	AsOfMonth >= Month;

// Удаляем не нужную таблицу
Drop table Month;

// Генерируем произвоольные продажи по месяцам
Sales:
Load 
    Round(Rand() * 100000 + 1, 2) as Sales
    , MonthStart(DayStart($(vMin) + (rand() * ($(vMax) - $(vMin))))) as Month
Autogenerate 20000;

Интерфейс

Создайте простую таблицу на листе, и добавьте в неё измерение - AsOfMonth

Далее мы создаем 5 мер, дополнительно я написал комментарии:

Sum(Sales) // Сумма продаж
Sum( {< MonthDiff = {"0"}>}  Sales) 
// Эта формула аналогична прошлой
Sum( {<MonthDiff = {"<3"}>} Sales ) 
// Эта формула считает продажи 3-ёх предыдущих месяцев
Sum( {<MonthDiff = {"<3"}>} Sales) / 
Count(Distinct {< MonthDiff = {"<3"}>} Month) 
// Эта формула считает средние продажи 3 предыдущих месяцев
// Удобно показывать в виде линии на комбинированной диаграмме
Sum( {<YearDiff = {"1"}>} Sales) 
// Показывает продажи прошлого года
// Если указать вместо 1 -> 0 то будут отбражаться продажи текущего года, 
// в котором находится AsOfMonth

Незабудьте поменять представление числа у мер, для лучшего восприятия