Ao analisarmos informação temporal temos por hábito utilizar as datas ou meses/anos para comparar os dados, ou seja, comparamos as vendas de Janeiro da loja 1 com as da loja 2. No entanto podemos também querer fazer uma variante desta análise com base no tempo de atividade de cada local.
Neste post irei falar de como podemos comparar o desempenho de cada loja no seu n mês de atividade, ou seja, se considerarmos que a loja 1 iniciou as suas vendas em janeiro 2019, a loja 2 iniciou em agosto 2020 e a loja 3 em março 2021 vamos então comparar estes 3 meses para cada uma.
O nosso modelo é composto por:
Sales:

Stores:

Calendar:

As relações entre as tabelas também são bastante simples, estando apresentadas no diagrama abaixo:

Utilizando uma simples tabela com o mês e o valor podemos os totais de vendas por mês/loja, no entanto o comparativo do primeiro mês está desfasado:

Para conseguirmos efetuar a análise pelo mês de atividade de cada loja temos então de recorrer a uma tabela auxiliar (com a ordenação dos meses) e a uma medida.
Criamos então a tabela abaixo:
ActivityMonths = GENERATESERIES(1, DISTINCTCOUNT('Calendar'[Year - Month]), 1)
A esta tabela adicionei também uma coluna com os números ordinais:
Month of activity =
'ActivityMonths'[Value]
& IF (
MOD ( ABS ( 'ActivityMonths'[Value] ), 100 ) > 10
&& MOD ( ABS ( 'ActivityMonths'[Value] ), 100 ) < 14,
"th",
SWITCH (
MOD ( ABS ( ActivityMonths[Value] ), 10 ) + 1,
1, "th",
2, "st",
3, "nd",
4, "rd",
"th"
)
)

Podemos então agora criar a medida abaixo:
Total Sales by month activity =
//TOPN Sales by month and store sorting is made in descending month/year
VAR salestable =
TOPN (
MAX ( ActivityMonths[Value] ),
FILTER (
ADDCOLUMNS (
SUMMARIZE ( Sales, 'Calendar'[Year - Month], Stores[Store] ),
"@TotalSales", CALCULATE ( SUM ( Sales[Sales] ) )
),
Stores[Store] = SELECTEDVALUE ( Stores[Store] )
),
'Calendar'[Year - Month], 1
) // Get the 1st row from the sales by month
VAR Sales_first_values =
TOPN ( 1, salestable )
RETURN
IF (
// validation of number month with sales
COUNTROWS (
SUMMARIZE ( Sales, Stores[Store], 'Calendar'[Year - Month] )
)
>= MAX ( ActivityMonths[Value] ),
// Get the values of the sales
SUMX ( Sales_first_values, [@TotalSales] )
)
Criando uma matriz temos o resultado abaixo:

Como podem verificar passamos a ter uma ordenação das vendas de acordo com o mês de atividade das lojas e não com a data de início.
Este tipo de análise pode ser útil para perceber se o crescimento dos indicadores se comporta da mesma maneira com o passar do tempo de atividade por exemplo com um gráfico de linhas:

Vamos então perceber o que fizemos com a nossa fórmula.
Começamos por criar uma tabela com os valores das vendas por mês e por loja:
VAR salestable =
TOPN (
MAX ( ActivityMonths[Value] ),
FILTER (
ADDCOLUMNS (
SUMMARIZE ( Sales, 'Calendar'[Year - Month], Stores[Store] ),
"@TotalSales", CALCULATE ( SUM ( Sales[Sales] ) )
),
Stores[Store] = SELECTEDVALUE ( Stores[Store] )
),
'Calendar'[Year - Month], 1
)

Como a função é filtrada pela loja obtemos apenas os dados dentro do contexto da matriz. Ao utilizarmos o TOPN podemos então ir buscar apenas as primeiras linhas da tabela anterior, sendo que realizamos uma ordenação descendente de data. Como podemos ver no exemplo abaixo onde vamos pesquisar as 5 primeiras linhas da Loja 1:

Como apenas pretendemos um valor por loja e tendo em atenção que a ordenação é descendente vamos utilizar o TOPN do 1º valor da tabela anterior e o resultado é apenas a primeira linha:

Utilizando depois uma função agregadora neste caso SUMX obtemos o total para o 5º mês de atividade da loja.
Utilizamos a tabela independente com o número de meses de atividade de modo a termos interatividade no cálculo do TOPN.
Podemos então ter a nossa análise por mês de atividade retirando a referência data da nossa análise, este tipo de informação poderá ser útil na comparação de desempenho de equipamentos, rotação de stocks ou análises similar em se pretende perceber a evolução durante o período de utilização e não sobre as datas em que se iniciaram os processos.