Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Power BI oferece várias ferramentas para executar cálculos baseados em tempo, que dependem de tabelas de datas automáticas ou tabelas de datas que você adiciona.
É recomendável usar a inteligência de tempo baseada em calendário (versão prévia) porque ela fornece o melhor desempenho e a maior variedade de flexibilidade para atender a qualquer calendário.
Esta tabela compara as três ferramentas fornecidas:
| Tool | Esforço de instalação necessário | Facilidade de gerenciamento | Flexibilidade | Anotações |
|---|---|---|---|---|
| Data/hora automática | praticamente zero | duro | low | Aumenta o tamanho do modelo devido a várias tabelas de data ocultas criadas |
| Inteligência de tempo clássica | meio | fácil | low | Requer a criação de uma tabela de datas, pressupondo o uso do calendário gregoriano ou do calendário gregoriano deslocado, e sofre de problemas de desempenho em alguns cenários específicos. |
| Inteligência de tempo baseada em calendário | high | meio | high | Recomendado para criar uma tabela de datas, maior flexibilidade, melhor desempenho, mas maior custo de instalação |
Observação
Aconselhamos não usar técnicas alternativas de inteligência de tempo, particularmente aquelas que envolvem a adição de colunas extras a tabelas de data para calcular deslocamentos, exceto para casos de uso específicos. Embora essas abordagens possam atrair iniciantes devido às fórmulas DAX simples, elas tendem a inflar modelos semânticos desnecessariamente. Esse inchaço pode levar a atualizações de dados mais lentas e à diminuição do desempenho do relatório conforme os conjuntos de dados crescem.
Data/hora automática
O recurso de data/hora automática cria automaticamente tabelas de data ocultas para cada campo de data em seu modelo de dados. Para obter mais informações sobre esse comportamento automático, consulte Aplicar data/hora automática no Power BI Desktop.
Observação
Embora a data/hora automática seja uma opção conveniente para modelos simples, não é recomendável para cenários mais complexos e modelos maiores. Para esses modelos, é preferível criar uma tabela dedicada para obter mais flexibilidade.
Adicionar uma tabela de datas
Para a maioria dos modelos, é recomendável adicionar uma tabela de datas (ou mais em alguns cenários). Muitos analistas de dados preferem criar suas próprias tabelas de data, o que é bom.
Há várias maneiras de criar essa tabela, incluindo:
- Power Query M. Você pode usar a função List.Dates . Um exemplo é fornecido posteriormente neste documento.
- DAX. Você pode usar as funções CALENDAR ou CALENDARAUTO para gerar uma tabela de data calculada básica. Você também pode usar uma instrução DAX mais avançada para criar uma tabela de datas. Um exemplo é fornecido posteriormente neste documento.
- Ferramentas externas.
- Carregando de uma origem, como um sistema de origem, um arquivo ou outro modelo semântico do Power BI.
Qual opção é melhor para você depende de vários fatores e está além do escopo deste tutorial.
Trabalhar com cálculos temporais
Supondo que você não esteja usando data/hora automática, há duas maneiras alternativas de trabalhar com funções de inteligência de tempo no Power BI para executar cálculos baseados em tempo:
- Inteligência de tempo clássica. É a opção mais fácil e funciona bem para calendários gregorianos ou deslocados, mas tem flexibilidade limitada para calendários estruturados de forma diferente ou para cálculos baseados em semanas.
- Inteligência de tempo baseada em calendário (versão prévia). Opção mais recente, mas requer um pouco mais de trabalho para configurar. No entanto, ele também oferece melhor desempenho, mais flexibilidade para trabalhar com calendários não gregorianos e a capacidade de executar cálculos baseados em semana.
Observação
Você precisa definir sua tabela como uma tabela de datas para cenários específicos.
Inteligência de tempo clássica
Essa opção exige que você tenha uma tabela de datas em seu modelo e defina-a adequadamente. Posteriormente, você pode usar as funções de inteligência temporal e fazer referência à tabela de datas. Por exemplo, se você tiver uma tabela de datas chamada Date em seu modelo que você definiu como sua tabela de datas, que contém uma coluna Data, você poderá usar:
SAMEPERIODLASTYEAR ( 'Date'[Date] )
Embora essa seja uma abordagem rápida e fácil, há muitas desvantagens em comparação com a abordagem baseada em calendário:
- requer que você defina a tabela de datas
- ele só funciona com modelos que têm pelo menos uma tabela de data dedicada
- as colunas de data usadas não devem ter datas ausentes entre as primeiras e as últimas datas. Se houver datas ausentes entre as primeiras e as últimas datas, um erro será gerado.
- é menos flexível, pois é otimizado para calendários gregorianos ou deslocados, como anos fiscais que iniciam em 1º de julho, mas ainda seguem um calendário gregoriano
- ele não fornece cálculos baseados em semana
- em cenários específicos, os cálculos baseados em tempo não têm um bom desempenho.
Observação
Recomendamos que você use a abordagem baseada em calendário aprimorada.
Inteligência de tempo baseada em calendário (versão prévia)
Calendários são definições de metadados adicionadas a uma tabela para indicar quais colunas dessa tabela representam quais atributos de tempo. Você pode definir um ou mais calendários em qualquer tabela em seu modelo. Depois de definir o calendário em seu modelo, você pode fazer referência a ele em suas funções de inteligência de tempo. Por exemplo, veja como calcular um ano total até a data de Vendas usando um calendário fiscal definido:
TOTALYTD ( [Sales], 'Fiscal Calendar' )
Benefícios da inteligência de tempo baseada em calendário
Os principais benefícios da inteligência de tempo baseada em calendário são:
Funciona com qualquer calendário
Os calendários oferecem flexibilidade total para decidir como dividir o tempo em anos, trimestres, meses e semanas. Você pode, por exemplo, definir os calendários que seguem estes padrões:
- Gregorian
- Gregoriano ajustado
- Varejo (445, 454, 544 padrões)
- 13 meses
- Lunar
As possibilidades são infinitas, pois não há nenhuma suposição interna do Power BI sobre como seu calendário é estruturado. A inteligência de tempo baseada em calendário não faz suposições sobre as datas subjacentes. Todos os cálculos usam os dados originais exatamente como estão.
Datas esparsas
A inteligência de hora clássica requer que a coluna de data fornecida seja concluída– se houver datas ausentes entre as primeiras e as últimas datas, um erro será gerado. As funções de inteligência de tempo baseadas em calendário não têm esse requisito. Em vez disso, eles operam nas datas como estão. Embora ainda seja recomendável ter uma tabela de calendário completa e dedicada, você não precisa mais ter isso. Por exemplo, se todas as suas lojas de varejo estiverem fechadas durante o fim de semana, você poderá ignorar os dias de fim de semana, pois elas não têm vendas. Supondo que o seu fim de semana seja sábado e domingo, agora você pode usar PREVIOUSDAY com um calendário baseado em uma tabela que não possui entradas para o fim de semana, permitindo assim pular da segunda-feira diretamente para a sexta-feira.
Cálculos baseados em semana
A inteligência de tempo baseada em calendário fornece diretamente funções DAX que operam com granularidade semanal. Por exemplo, os totais de semana a data podem ser computados diretamente usando TOTALWTD:
TOTALWTD ( Expr, CalendarName )
Aprimoramentos de desempenho
Alguns cenários podem apresentar melhor desempenho ao comparar uma função de inteligência de tempo baseada em calendário com seu equivalente clássico. Por exemplo, um visual que é agrupado pela semana e executa um cálculo de ano a ano usando TOTALYTD ( ..., CalendarName ) geralmente deve ser executado mais rapidamente do que se seu equivalente clássico, TOTALYTD ( ..., TableName[DateColumnName] )fosse usado. Para obter informações sobre por que isso pode acontecer, consulte a seção Desmarcação de contexto .
Habilitar a visualização aprimorada do DAX Time Intelligence
Para começar, primeiro você precisa habilitar o recurso avançado de visualização do DAX Time Intelligence .
- No Power BI Desktop, acesse Arquivo > Opções e configurações > Opções > Recursos de visualização.
- Selecione a visualização Avançada do DAX Time Intelligence.
- Selecione OK
- Reiniciar o Power BI Desktop
Gerenciar calendários
Para gerenciar um calendário, clique com o botão direito do mouse na tabela que contém o calendário ou no qual você deseja definir o calendário e escolha as opções calendário ou selecione opções calendário na faixa de opções ferramentas tabela depois de selecionar a tabela:
Como alternativa, você pode usar ferramentas externas ou a exibição TMDL para definir um calendário. Para obter mais informações, consulte o script TMDL.
Os calendários também são mostrados no gerenciador de modelos sob a tabela na qual são definidos:
A tela de opções de calendário
A tela de opções de calendário mostra os calendários definidos na tabela selecionada. Aqui, você pode ver:
- criar um novo calendário selecionando Novo calendário
- editar um calendário existente selecionando Editar
- excluir um calendário existente selecionando Excluir
- definir a tabela como uma tabela de data selecionando Marcar como tabela de data
Atribuir categorias de coluna
Definir um calendário envolve dar-lhe um nome e atribuir colunas a categorias. Cada categoria representa uma unidade de tempo e categorias de coluna específicas estão disponíveis. Você precisa, pelo menos, atribuir uma coluna primária a uma categoria para salvar seu calendário. Cada categoria deve ter uma coluna primária e pode ter zero ou mais colunas associadas. Sempre que as colunas associadas a uma categoria estiverem no contexto, o Power BI saberá qual unidade de tempo elas apresentam. Além disso, para algumas funções, como TOTALMTD o Power BI, usa a coluna primária mapeada para a categoria relevante no calendário referenciado para executar o cálculo solicitado. Para atribuir uma coluna a uma categoria, selecione a categoria no menu Adicionar categoria e, em seguida, selecione as colunas associadas primárias e opcionais.
Categorias de coluna disponíveis
A tabela a seguir mostra as categorias disponíveis. A tabela também fornece valores de exemplo e cardinalidades para calendários gregorianos.
As categorias são divididas em dois grupos:
- Concluído. Dados em colunas atribuídas a categorias Completas são suficientes para identificar exclusivamente o período de tempo.
- Parcial. Dados em colunas atribuídas a categorias parciais não são suficientes para identificar exclusivamente o período de tempo.
| Categoria | Description | Tipo | Exemplo de cardinalidade em um calendário gregoriano | Valores de coluna de exemplo em um calendário gregoriano |
|---|---|---|---|---|
| Ano | O ano | Concluir |
Y = número de anos |
2024, 2025 |
| Trimestre | O trimestre incluindo o ano | Concluir | 4*Y |
1º trimestre de 2024, 2º trimestre de 2025 |
| Trimestre do ano | O trimestre do ano | Parcial | 4 |
1º Trimestre do Ano, YQ1, 1º Trimestre, 2º Trimestre |
| Mês | O mês incluindo o ano | Concluir | 12*Y ≤ value ≤ 13*Y |
Janeiro de 2023, fevereiro de 2024 |
| Mês do Ano | O mês do ano | Parcial | 12 |
Janeiro, Ano Mês 11, YM11, M11, 11 |
| Mês do Trimestre | O mês do trimestre | Parcial | 3 |
1, QM2 |
| Week | A semana incluindo o ano | Concluir | 52 ≤ value ≤ 53 |
Semana 50 2023, W50-2023, 2023-W50 |
| Semana do Ano | A semana do ano | Parcial | 52 |
Semana 50, W50, 50 |
| Semana do Trimestre | A semana do trimestre | Parcial | 13 |
Trimestre semana 10, QW10, 10 |
| Semana do Mês | A semana do mês | Parcial | 5 |
Semana 2 do Mês, MW2, 2 |
| Date | A data | Concluir | 365*Y ≤ value ≤ 366*Y |
31/12/2025 |
| Dia do Ano | O dia do ano | Parcial | 365 ≤ value ≤366 |
365, D1 |
| Dia do Trimestre | O dia do trimestre | Parcial | 92 |
Dia do Trimestre 10, QD2, 50 |
| Dia do Mês | O dia do mês | Parcial | 31 |
Dia 30 do mês, MD10, 30 |
| Dia da Semana | O dia da semana | Parcial | 7 |
Semana 5, WD5, 5 |
Além dessas categorias, você pode associar qualquer número de colunas em sua tabela à categoria relacionada ao tempo . No momento, isso não é possível nas opções de calendário, mas pode ser feito apenas usando ferramentas externas ou TMDL.
Observação
O contexto em todas as colunas atribuídas à categoria relacionada ao tempo é removido ao executar cálculos em todas as funções, exceto DATEADD .SAMEPERIODLASTYEAR Qualquer contexto em colunas que fazem parte da tabela na qual o calendário é definido, mas não estão etiquetadas nesse calendário, é mantido.
Observação
Recomendamos que você associe apenas as colunas em seu calendário que deseja usar em cálculos de análise temporal.
Colunas primárias versus associadas
A coluna primária é necessária para cada categoria. Sempre que essa coluna ou qualquer coluna associada atribuída à mesma categoria no calendário referenciado estiver no contexto ou a categoria for necessária para executar um cálculo, o Power BI usará a coluna primária. Além disso, as colunas primárias são usadas para classificação. Se os valores na coluna primária não permitirem que ela seja classificada conforme o esperado, você poderá configurar a coluna primária para classificar por outra coluna ou usar outra coluna e tornar a coluna original uma coluna associada. Por exemplo, uma coluna com dados textuais que contêm o número do mês e o ano em um formato de mm-yyyy (ou seja, 01-2024e 02-2024assim por diante) não será classificada corretamente ao longo de vários anos, mas uma coluna que usa o yyyy-mm formato será:
Você pode ter zero ou mais colunas associadas atribuídas a uma categoria.
Validation
É importante validar e testar seu calendário para que você tenha certeza de que ele atende às suas necessidades. As validações oferecidas no Power BI incluem validações em tempo real e validações offline.
Observação
Você pode salvar seu calendário apesar dos erros de validação offline, mas resolvê-los primeiro é recomendável. As falhas de validação em tempo real devem ser corrigidas para que seja possível salvar.
Validações em tempo real
As validações em tempo real executadas nos calendários são:
- Nome do calendário exclusivo. Cada calendário precisa ter um nome exclusivo no modelo semântico.
- Associação única por calendário. Uma coluna não pode pertencer a mais de uma categoria no mesmo calendário.
- Exclusividade do período. As categorias atribuídas devem identificar exclusivamente o período.
- Categorização consistente. Isso garante que as colunas estejam associadas à mesma categoria entre calendários.
Unicidade do período
Sempre deve haver um caminho para identificar exclusivamente o período para as categorias atribuídas.
Sempre que você adiciona uma categoria parcial, o Power BI valida que uma combinação correspondente de categorias completas ou parciais também é marcada no mesmo calendário. Se esse não for o caso, um aviso será mostrado.
Por exemplo, ao configurar um calendário para cálculos baseados em semana, atribua pelo menos uma coluna primária a um dos seguintes conjuntos de categorias:
- Week
- Semana do ano, Ano
- Semana do Trimestre, Trimestre
- Semana do trimestre, Trimestre do ano, Ano
- Semana do Mês, Mês
- Semana do Mês, Mês do Ano, Ano
- Semana do Mês, Mês do Trimestre, Trimestre
- Semana do Mês, Mês do Trimestre, Trimestre do Ano, Ano
Categorização consistente
As colunas devem ter uma categoria consistente entre calendários. Você não pode atribuir a mesma coluna a categorias diferentes, como Ano, Trimestre do Ano ou relacionadas ao tempo em calendários separados.
Validações offline
As validações offline podem ser demoradas à medida que acessam os dados da tabela. Portanto, eles não são executados automaticamente em contraste com as validações em tempo real. Para executar as validações, selecione Validar dados:
As validações offline verificam as seguintes regras e retornam um aviso se alguma regra for invalidada em seu calendário:
- uma coluna associada a uma categoria não tem valores em branco.
- categorias de nível superior e de nível inferior têm uma relação de cardinalidade de um para muitos. Por exemplo, as colunas associadas à categoria Ano devem ter uma cardinalidade um-para-muitos com colunas associadas à categoria Mês.
- colunas associadas a categorias no mesmo nível têm uma relação de cardinalidade um-para-um. Por exemplo, as colunas associadas à categoria Mês devem ter uma cardinalidade um-para-um com as combinações das colunas associadas às categorias Mês de Ano e Ano.
- as colunas primárias e associadas atribuídas à mesma categoria têm uma relação de cardinalidade um-para-um. Por exemplo, quando atribuído à categoria Mês, uma coluna primária Month e uma coluna associada EnglishMonthName devem ter uma cardinalidade de um para um.
Trabalhar com calendários
Depois que um calendário é definido, você pode fazer referência a ele em funções de inteligência de tempo. Por exemplo, a medida a seguir calcula um valor total acumulado do mês até a data da Quantidade Total em relação ao calendário ISO-454:
Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )
Se o calendário não estiver definido e o erro for retornado:
Mesmo que o calendário seja definido, no entanto, uma medida ainda poderá retornar um erro. Isso acontece se a função usada espera que uma categoria esteja presente no calendário e o calendário não tenha essa categoria. Por exemplo, TOTALWTD espera que categorias específicas estejam presentes no calendário. Se não estiverem, um erro será retornado:
Funções de inteligência temporal e categorias necessárias
Muitas funções de inteligência de tempo exigem categorias suficientes para serem incluídas no calendário referenciado na chamada de função para que o Power BI possa identificar uma unidade de tempo exclusivamente específica. Em outras palavras, o Power BI precisa ser capaz de "subir" do nível em que o cálculo é executado até um ano individual. Por exemplo, ao executar um cálculo em trimestres, usando TOTALQTD, atribua a categoria Trimestre ou atribua ambas as categorias Trimestre do Ano e Ano no calendário, conforme ditado pela validação de unicidade de período.
Observação
Para algumas funções, seu nome é um indicativo de qual nível o cálculo opera (por exemplo), TOTALYTDenquanto para outras depende dos parâmetros e contexto (por exemplo, DATEADD).
Limpeza de contexto
As funções de inteligência de tempo operam começando em um ponto no tempo e, em seguida, executando alguma operação nela, a fim de produzir um ponto diferente no tempo. Naturalmente, o ponto inicial no tempo pode entrar em conflito com esse resultado, causando uma interseção de contexto de filtro que, por padrão, produziria resultados parciais ou vazios. Por exemplo, leve em consideração o seguinte cenário.
Definição de calendário
Temos um calendário gregoriano simples que marca três categorias, definidas como:
| Categoria | Coluna Primária |
|---|---|
| Ano | Ano |
| Mês do Ano | MêsDoAno |
| Trimestre | Trimestre |
Definições de medida
Duas medidas básicas são definidas: uma para calcular o total de vendas e outra para calcular o total de vendas do trimestre anterior:
[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )
Exemplo: como funciona a limpeza de contexto
Nosso visual de tabela navega com uma granularidade mensal usando as colunas Year e MonthOfYear
| Ano | MêsDoAno | VendasTotais | LastQuarterSales |
|---|---|---|---|
| 2011 | 1 | 10 | |
| 2011 | 2 | 20 | |
| 2011 | 3 | 30 | |
| 2011 | 4 | 40 | 10 |
| 2011 | 5 | 50 | 20 |
Nesta tabela, a linha em negrito representa dados no nível de mês, especificamente para abril de 2011. Portanto, todas as medidas nessa linha serão avaliadas no contexto de filtro de [Ano] == 2011 e [MonthOfYear] == 4.
Como esperado, o TotalSales aqui é computado como o total de vendas de abril de 2011.
LastQuarterSales calcula TotalSales de forma semelhante, mas com um filtro extra fornecido pela função baseada em DATEADD calendário.
Para esta linha, DATEADD teria um ponto inicial no tempo em abril de 2011 e resultaria no momento que é exatamente um trimestre antes: janeiro de 2011. Como resultado, pode-se esperar que esse TotalSales seja computado nos dois contextos de filtro a seguir:
- Fornecido pelas colunas de navegação da linha atual:
{ [Year] == 2011, [MonthOfYear] == 4 }(Equivalentemente, abril de 2011) - Fornecido pelo DATEADD filtro:
{ [Year] == 2011, [MonthOfYear] == 1 }(Equivalentemente, janeiro de 2011)
Claramente, esses dois contextos de filtro entrariam em conflito - não podemos avaliar o total de vendas considerando o mês atual simultaneamente como janeiro de 2011 e abril de 2011. Tal interseção não produziria resultados.
No entanto, isso não é o que ocorre. Em vez disso, com base na definição de calendário, as funções de inteligência de tempo baseadas em calendário identificam quais colunas de categorias podem resultar em conflitos, seguindo a operação de tempo executada pela função. Nesse caso, DATEADD executa uma mudança no nível Trimestre. A função identifica que as categorias Ano e Mês do Ano podem ser alteradas como resultado de uma alteração nas colunas da categoria Trimestre . Assim, a função limpa o contexto de filtro em todas as colunas (primárias e associadas) marcadas para essas categorias.
Em outras palavras, podemos dizer que as categorias Ano e Mês do Ano são dependências da categoria Trimestre . Por outro lado, podemos dizer que a categoria Trimestre é dependente das categorias Ano e Mês do Ano .
Como funciona a limpeza de contexto
Esse diagrama é fornecido para visualizar melhor as dependências entre as diferentes categorias de tempo. Cada categoria nessa rede representa todas as colunas (primárias e associadas) marcadas para essa categoria. As categorias são conectadas às dependências por meio de setas. Por exemplo, "Mês" depende de "Ano", "Trimestre", "Mês do Trimestre", "Trimestre", e "Mês do Ano".
Quando o contexto é definido em uma coluna ou na sua coluna de classificação associada marcada em um calendário, o contexto de filtro anterior é limpo em:
- Todas as dependências de categoria relacionadas a X. Isso pode ser entendido como todas as categorias acima de X.
- Todos os dependentes da categoria tanto de X quanto de suas dependências (ou seja, de 1. acima). Isso pode ser considerado como todas as categorias abaixo de X e todas as categorias em 1 acima.
Observação
A limpeza de contexto ocorre em colunas marcadas em um calendário ou colunas de classificação associadas , independentemente de o contexto ser definido usando funções de inteligência de tempo ou de outra forma.
Colunas relacionadas ao tempo
A maioria das funções de inteligência de tempo, exceto DATEADD e SAMEPERIODLASTYEAR, limpará o contexto em todas as colunas relacionadas ao tempo e nas colunas associadas de classificação.
Comportamento entre calendários
Se houver vários calendários definidos na mesma tabela, esses processos serão concluídos para cada calendário definido na tabela. Isso inclui a observação sobre a limpeza de contexto de colunas relacionadas ao tempo. Em outras palavras, suponha que uma tabela defina três calendários: Calendar1, Calendar2 e Calendar3. Se o contexto de filtro for definido na categoria "X" no Calendar1, os processos acima serão executados nos três calendários.
Exemplo: filtro definido em "Trimestre"
Se o contexto do filtro fosse definido na categoria "Trimestre", o processo seria o seguinte.
Primeiro, todas as dependências da categoria "Quarter" seriam consideradas.
Em seguida, todos os dependentes de "Trimestre" e suas dependências seriam considerados.
Por fim, o resultado final seria o seguinte. Todas as categorias de cor vermelha teriam seu contexto de filtro anterior removido e o novo contexto é definido em Trimestre.
Script TMDL para calendários
createOrReplace
table Date
lineageTag: xyz
column Date
dataType: dateTime
formatString: Long Date
lineageTag: abc
summarizeBy: none
sourceColumn: Date
column Year
dataType: string
lineageTag: abc
summarizeBy: none
sourceColumn: Year
annotation SummarizationSetBy = Automatic
column Month
dataType: string
lineageTag: def
summarizeBy: none
sourceColumn: Month
annotation SummarizationSetBy = Automatic
column MonthName
dataType: string
lineageTag: ghi
summarizeBy: none
sourceColumn: MonthName
sortByColumn: SortByMonth
changedProperty = SortByColumn
annotation SummarizationSetBy = Automatic
column DutchMonthName
dataType: string
lineageTag: jkl
summarizeBy: none
sourceColumn: DutchMonthName
annotation SummarizationSetBy = Automatic
column 'Holiday Name'
dataType: string
lineageTag: mno
summarizeBy: none
sourceColumn: Holiday Name
annotation SummarizationSetBy = Automatic
column IsWorkingDay
dataType: string
lineageTag: pqr
summarizeBy: none
sourceColumn: IsWorkingDay
annotation SummarizationSetBy = Automatic
...
calendar 'Demo Calendar'
lineageTag: def
calendarColumnGroup = year
primaryColumn: Year
calendarColumnGroup = month
primaryColumn: Month
associatedColumn: DutchMonthName
associatedColumn: MonthName
calendarColumnGroup
column: 'Holiday Name'
column: isWorkingDay
Observação
Observe que, se você não especificar nenhuma categoria para o calendarColumnGroup TMDL, as colunas serão marcadas como relacionadas ao tempo. Neste exemplo, Nome do Feriado e isWorkingDay são colunas relacionadas ao tempo no Calendário de Demonstração.
Juntar tudo: exemplos de mudança de tempo
Algumas funções de inteligência de tempo alteram o contexto apenas lateralmente, considerando todas as colunas, enquanto outras realizam alterações hierárquicas, mantendo ou limpando o contexto dependendo de se as colunas são marcadas no calendário. As funções de inteligência de tempo podem ser divididas em dois grupos com base em se permitem mudanças hierárquicas:
- Corrigido. As funções neste grupo são DATEADD e SAMEPERIODLASTYEAR. Essas funções só permitem turnos de tempo laterais e não retornam valores de um nível diferente de detalhes.
- Flexível. Esse grupo contém todas as outras funções de análise temporal. Essas funções permitem turnos de tempo hierárquicos e, dependendo da configuração do calendário, podem retornar resultados de um nível diferente de detalhes.
Para mostrar esses comportamentos, vamos percorrer um exemplo usando um modelo de dados simples que consiste em duas tabelas, dois calendários e cinco medidas.
Tabelas e relações
Para este exemplo, temos o seguinte modelo de dados simples:
| Table | Columns |
|---|---|
| Date | Ano, DiaÚtil, Data |
| Sales | OrderKey, Quantidade, Data do Pedido |
Aqui estão alguns exemplos de linhas na tabela Data :
Aqui estão algumas linhas de exemplo na tabela Vendas :
As tabelas Vendas e Data estão relacionadas em OrderDate e Date.
Calendars
Na tabela Data , definimos calendários com estes mapeamentos:
| NomeDoCalendário | Categoria | Coluna Primária |
|---|---|---|
| Gregoriano | Ano | Ano |
| Date | Date | |
| GregorianoWithWorkingDay | Ano | Ano |
| Date | Date | |
| Relacionado ao tempo | IsWorkingDay |
A definição de TMDL equivalente desses dois calendários é:
ref table Date
calendar 'Gregorian'
lineageTag: xyz
calendarColumnGroup = year
primaryColumn: Year
calendarColumnGroup = date
primaryColumn: Date
calendar 'GregorianWithWorkingDay'
lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
calendarColumnGroup = year
primaryColumn: Year
calendarColumnGroup = date
primaryColumn: Date
calendarColumnGroup
column: IsWorkingDay
Medidas
Na tabela Vendas , definimos as seguintes medidas:
Total Quantity = SUM ( 'Sales'[Order Quantity] )
OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )
OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )
FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )
FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)
Exemplo de deslocamento lateral
Vamos criar um visual que mostra Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity e OneYearAgoQuantityTimeRelated para 2024 e 2025:
Todos os valores para OneYearAgoQuantity e OneYearAgoQuantityTimeRelated para 2025 correspondem à Quantidade Total de exatamente um ano antes (2024), para o mesmo valor IsWorkingDay .
Isso mostra que DATEADD mantém o contexto em qualquer coluna na tabela Data que contenha o calendário usado, independentemente se ele não estiver marcado ou se estiver marcado como relacionado ao tempo nesse calendário. Como em nossas definições de medida instruímos DATEADD a voltar em um ano, a única coluna cujo contexto foi deslocado foi a coluna associada à categoria Ano. Se a coluna IsWorkingDay foi marcada no calendário como relacionada ao tempo ou não marcada, não alterou o resultado. A única outra função que exibe esse comportamento é SAMEPERIODLASTYEAR.
Exemplo de deslocamento hierárquico
Agora, vamos examinar um exemplo no qual se uma coluna está marcada como relacionada ao tempo ou não realmente altera o resultado.
Para isso, recriaremos o mesmo visual do exemplo anterior, mas desta vez usaremos as medidas FullLastYearQuantity e FullLastYearQuantityTimeRelated:
Isso mostra que PARALLELPERIOD preserva o contexto para colunas não marcadas no calendário, mas limpa o contexto para aquelas marcadas como relacionadas ao tempo. FullLastYearQuantity usou o calendário gregoriano onde IsWorkingDay não foi marcado no calendário, enquanto FullLastYearQuantityTimeRelated usou o calendário GregorianWithWorkingDay onde IsWorkingDay foi marcado como relacionado ao tempo. Todas as funções de inteligência de tempo, exceto DATEADD e SAMEPERIODLASTYEAR, se comportam dessa maneira.
Bônus: se você realmente quiser forçar essas funções a preservar o contexto para colunas relacionadas ao tempo também, você pode usar VALUES:
FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )
Nesse caso, FullLastYearQuantityTimeRelatedOverride retorna os mesmos resultados que FullLastYearQuantity.
Conclusion
O exemplo elaborado acima mostra que diferentes funções de inteligência de tempo se comportam de forma diferente, dependendo se as colunas são marcadas como relacionadas ao tempo no calendário. DATEADD e SAMEPERIODLASTYEAR realizam apenas deslocamentos laterais no tempo. Todas as outras funções de inteligência de tempo permitem turnos de tempo hierárquicos.
Usar DATEADD com calendários
A DATEADD função tem parâmetros específicos que permitem controle refinado sobre como as mudanças são executadas quando a seleção está em um nível mais granular do que o nível de deslocamento indicado pelo interval parâmetro em DATEADD. Isso acontece, por exemplo, se você estiver mostrando dados no nível de data, mas definir o interval parâmetro como DATEADDMONTH. Por exemplo, em um calendário gregoriano, ao mudar um período que se estende de 3 a 10 de março por um mês resultará em 3 a 10 de abril. No entanto, uma vez que meses em calendários gregorianos variam de comprimento, isso pode levar a ambiguidades ao mudar. Veja abaixo cenários de exemplo com base em um calendário gregoriano:
Mudar de um período mais curto para um período mais longo
Por exemplo, mudar para o mês seguinte a partir de uma seleção em fevereiro, assim o mês de destino é março.
Você pode usar o extension parâmetro para influenciar como a mudança é executada:
| Valor do parâmetro de extensão | Description | Resultado |
|---|---|---|
precise |
Isso mantém rigorosamente o intervalo de datas original. | 25 a 28 de fevereiro é transferido para 25 a 28 de março. |
extended |
Permite que a janela se expanda até o final do mês. | 25 a 28 de fevereiro é transferido para 25 a 31 de março. |
Mudar de um período mais longo para um período mais curto
Por exemplo, ao retroceder um mês a partir de uma seleção em março, o mês alvo passa a ser fevereiro.
Você pode usar o truncation parâmetro para influenciar como a mudança é executada:
| Valor do parâmetro de truncamento | Description | Resultado |
|---|---|---|
anchored |
Ancora o resultado para a última data válida do mês menor. | 31 de março é transferido para 28 de fevereiro (ou 29 no ano bissexto). |
blank |
Quando uma data alterada não existir, retorne vazio. | Retroceder a data de 31 de março em um mês retorna em branco (como 31 de fevereiro não existe). |
Considerações sobre como trabalhar com inteligência de tempo baseada em calendário
- Executar um cálculo de inteligência de tempo em uma tabela de fatos que define um calendário e que está sujeita a regras de segurança em nível de linha (RLS) pode levar a resultados inesperados.
- O desempenho desse recurso de visualização não representa o produto final.
- Você ainda não pode criar calendários no Serviço do Power BI.
- Você não deve usar tabelas automáticas de data/hora com calendários personalizados.
- Você não pode usar calendários com modelos dinâmicos conectados ou compostos.
- Recomendamos que você associe apenas as colunas em seu calendário que deseja usar em cálculos de análise temporal.
- Os calendários estão sujeitos a validações em tempo real e offline . Você pode salvar seu calendário apesar dos erros de validação offline, mas resolvê-los primeiro é recomendável. As falhas de validação em tempo real devem ser corrigidas para que seja possível salvar.
- Cada calendário deve ter um nome exclusivo dentro do modelo de dados
- Uma única tabela pode conter vários calendários
- A tabela que contém o calendário deve ter menos de 200 colunas. Se a tabela contiver mais de 20.000 linhas, as validações não estarão disponíveis, mas você ainda poderá adicionar um calendário.
- Um calendário deve, pelo menos, atribuir uma coluna primária a uma categoria
- Um calendário só pode atribuir colunas de sua própria tabela a categorias
- Cada categoria deve ter uma coluna primária e pode ter zero ou mais colunas associadas atribuídas
- DATEADD tem novos parâmetros para controlar extensões e seus comportamentos, que não são reconhecidos no IntelliSense.
- Qualquer coluna determinada pode ser mapeada para apenas uma categoria
- Você não pode aninhar funções de inteligência de tempo que usam calendários. Por exemplo, a instrução DAX a seguir não é suportada:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )
Em vez disso, você pode fazer:
ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )
Criar uma tabela de datas usando ferramentas internas
Os exemplos a seguir criam uma tabela de datas de 1º de janeiro de 2010 a 31 de dezembro de 2030 usando o Power Query M ou o DAX. Ele inclui as seguintes colunas: Ano, Número do Mês, Nome do Mês, Ano, Trimestre, Trimestre do Ano, Dia e Data.
Power Query M
let
StartDate = #date(2010, 1, 1),
EndDate = #date(2030, 12, 31),
NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
AddDay
DAX
DateTable =
ADDCOLUMNS (
CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
"Year", YEAR ( [Date] ),
"Month Number", MONTH ( [Date] ),
"Month Name", FORMAT ( [Date], "MMMM" ),
"Month Year", FORMAT ( [Date], "MMM YYYY" ),
"Quarter", "Q" & FORMAT ( [Date], "Q" ),
"Year Quarter",
FORMAT ( [Date], "YYYY" ) & " Q"
& FORMAT ( [Date], "Q" ),
"Day", DAY ( [Date] ),
"Date", [Date]
)
Para obter mais informações e mais opções, consulte tabelas de data.
Conteúdo relacionado
Para obter mais informações relacionadas a este artigo, consulte os seguintes recursos: