Partager via


Implémenter des calculs basés sur le temps dans Power BI

Power BI offre plusieurs outils pour effectuer des calculs basés sur le temps, qui s’appuient sur des tables de dates automatiques ou des tables de dates que vous ajoutez.

Nous vous recommandons d’utiliser l’intelligence temporelle basée sur le calendrier (préversion), car elle offre les meilleures performances et une plus grande flexibilité pour répondre à n’importe quel calendrier.

Ce tableau compare les trois outils fournis :

Tool Effort d’installation requis Facilité de gestion Flexibilité Remarques
Date/heure automatique pratiquement zéro difficile bas Augmente la taille du modèle en raison de plusieurs tables de dates masquées créées
Intelligence temporelle classique medium facile bas Nécessite la création d’une table de dates, suppose que le calendrier grégorien ou décalé souffre de problèmes de performances dans certains scénarios spécifiques
Intelligence temporelle basée sur le calendrier haut medium haut Recommandé pour créer une table de dates, une flexibilité la plus élevée, des performances optimales, mais un coût d’installation accru

Note

Nous vous déconseillons d’utiliser d’autres techniques d’intelligence temporelle, en particulier celles qui impliquent l’ajout de colonnes supplémentaires aux tables de dates pour calculer des décalages à l’exception de cas d’usage spécifiques. Bien que ces approches puissent attirer les débutants en raison de leurs formules DAX simples, elles ont tendance à gonfler inutilement les modèles sémantiques. Ce ballonnement peut entraîner des actualisations de données plus lentes et des performances de rapport réduites à mesure que les jeux de données augmentent.

Date/heure automatique

La fonctionnalité de date/heure automatique crée automatiquement des tables de dates masquées pour chaque champ de date dans votre modèle de données. Pour plus d’informations sur ce comportement automatique, consultez Appliquer la date/heure automatique dans Power BI Desktop.

Note

Bien que la date/heure automatique soit une option pratique pour les modèles simples, il n’est pas recommandé pour les scénarios plus complexes et les modèles plus volumineux. Pour ces modèles, il est préférable de créer une table dédiée pour plus de flexibilité.

Ajouter une table de dates

Pour la plupart des modèles, il est recommandé d’ajouter une table de dates (ou plus dans certains scénarios). De nombreux analystes de données préfèrent créer leurs propres tables de dates, ce qui est correct.

Il existe plusieurs façons de créer une telle table, notamment :

Quelle option est la meilleure pour vous dépend de différents facteurs et est au-delà de l’étendue de ce didacticiel.

Utiliser des calculs basés sur le temps

En supposant que vous n’utilisez pas la date/heure automatique, il existe deux autres façons d’utiliser les fonctions Time Intelligence dans Power BI pour effectuer des calculs basés sur le temps :

  • Intelligence temporelle classique. L’option la plus simple et fonctionne parfaitement pour les calendriers grégoriens ou décalés, mais a une flexibilité limitée pour les calendriers structurés différemment ou pour les calculs basés sur des semaines.
  • Intelligence de temps basée sur le calendrier (aperçu) Option plus récente, mais nécessite un peu plus de travail à configurer. Toutefois, il vous offre également de meilleures performances, plus de flexibilité pour travailler avec des calendriers non grégoriens et la possibilité d’effectuer des calculs basés sur des semaines.

Note

Vous devez définir votre table comme table de dates pour des scénarios spécifiques.

Intelligence temporelle classique

Cette option vous oblige à disposer d’une table de dates dans votre modèle et de la définir en conséquence. Ensuite, vous pouvez utiliser les fonctions Time Intelligence et faire référence à votre table de dates. Par exemple, si vous avez une table de dates appelée Date dans votre modèle que vous définissez comme table de dates, qui contient une colonne Date, vous pouvez utiliser :

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Bien qu’il s’agit d’une approche rapide et facile, il existe de nombreux inconvénients par rapport à l’approche basée sur le calendrier :

  • elle nécessite que vous définissiez la table de dates
  • il fonctionne uniquement avec les modèles qui ont au moins une table de dates dédiées
  • les colonnes de date utilisées ne doivent pas avoir de dates manquantes entre les premières et les dernières dates. S'il existe des dates manquantes entre la première et la dernière date, une erreur est générée.
  • il est moins flexible, car il est optimisé pour les calendriers grégoriens ou décalés, tels que les années fiscales qui commencent le 1er juillet, mais suivent toujours un calendrier grégorien
  • il ne fournit pas de calculs basés sur des semaines
  • dans des scénarios spécifiques, les calculs basés sur le temps ne fonctionnent pas correctement.

Note

Nous vous recommandons d’utiliser l’approche améliorée basée sur le calendrier .

Intelligence temporelle basée sur le calendrier (aperçu)

Les calendriers sont des définitions de métadonnées ajoutées à une table pour indiquer les colonnes de cette table qui représentent les attributs du temps. Vous pouvez définir un ou plusieurs calendriers sur n’importe quelle table de votre modèle. Après avoir défini le calendrier dans votre modèle, vous pouvez y faire référence dans vos fonctions time-intelligence. Par exemple, voici comment calculer une année totale à la date des ventes à l’aide d’un calendrier fiscal défini :

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Avantages de l’intelligence temporelle basée sur le calendrier

Les principaux avantages de l’intelligence temporelle basée sur le calendrier sont les suivants :

Fonctionne avec n’importe quel calendrier

Les calendriers vous donnent toute la possibilité de décider comment diviser le temps en années, trimestres, mois et semaines. Vous pouvez, par exemple, définir les calendriers qui suivent ces modèles :

  • Gregorian
  • Grégorien décalé
  • Vente au détail (445, 454, 544 modèles)
  • 13 mois
  • Lunaire

Les possibilités sont infinies, car il n’existe aucune hypothèse intégrée de Power BI sur la façon dont votre calendrier est structuré. L’intelligence temporelle basée sur le calendrier ne fait aucune hypothèse sur les dates sous-jacentes. Tous les calculs utilisent exactement les données sous-jacentes as-is.

Dates éparses

L’intelligence temporelle classique exige que la colonne de date fournie soit complète : s’il y a des dates manquantes entre la première et la dernière date, une erreur est générée. Les fonctions d’intelligence temporelle basées sur le calendrier ne disposent pas d’une telle exigence. Au lieu de cela, ils traitent les dates telles quelles. Bien que nous vous recommandons toujours d’avoir une table de calendrier complète et dédiée, vous n’êtes plus tenu de le faire. Par exemple, si tous vos magasins de détail sont fermés pendant le week-end, vous pouvez ignorer les jours de fin de semaine, car ils n’ont pas de ventes. En supposant que votre week-end est samedi et dimanche, vous pouvez désormais utiliser PREVIOUSDAY un calendrier basé sur une table qui n’a pas d’entrées pour le week-end pour passer du lundi directement au vendredi.

Calculs basés sur la semaine

L’intelligence temporelle basée sur le calendrier fournit directement des fonctions DAX qui fonctionnent à une granularité de semaine. Par exemple, les totaux hebdomadaires à jour peuvent être calculés directement à l’aide de TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Améliorations des performances

Certains scénarios peuvent présenter des performances améliorées lors de la comparaison d’une fonction d’intelligence temporelle basée sur le calendrier à son équivalent classique. Par exemple, un visuel qui est regroupé par semaine et effectue un calcul d’année à jour à l’aide TOTALYTD ( ..., CalendarName ) doit généralement s’exécuter plus rapidement que si son équivalent classique, TOTALYTD ( ..., TableName[DateColumnName] )a été utilisé. Pour plus d’informations sur la raison pour laquelle cela peut se produire, reportez-vous à la section d’effacement de contexte .

Activer la préversion améliorée de DAX Time Intelligence

Pour commencer, vous devez d’abord activer la fonctionnalité de prévisualisation Enhanced DAX Time Intelligence.

  1. Dans Power BI Desktop, accédez à Fichier > Options et paramètres > Options > Fonctionnalités en aperçu.
  2. Sélectionnez la préversion DAX Time Intelligence améliorée .
  3. Sélectionnez OK.
  4. Redémarrer Power BI Desktop

Gérer les calendriers

Pour gérer un calendrier, cliquez avec le bouton droit sur la table qui contient le calendrier ou sur lequel vous souhaitez définir le calendrier et choisissez les options Calendrier ou sélectionnez les options Calendrier dans le ruban Outils de tableau après avoir sélectionné le tableau :

Capture d’écran montrant les points d’entrée pour ouvrir les options de calendrier sur un tableau.

Vous pouvez également utiliser des outils externes ou la vue TMDL pour définir un calendrier. Pour plus d’informations, consultez le script TMDL.

Les calendriers sont également affichés dans l’Explorateur de modèles sous la table sur laquelle ils sont définis :

Capture d’écran montrant l’explorateur de modèles pour un modèle sémantique. Le nœud de la table de dates est développé et les calendriers sont mis en surbrillance.

Écran Options du calendrier

L’écran options du calendrier affiche les calendriers définis dans le tableau sélectionné. Ici, vous pouvez :

  • créer un calendrier en sélectionnant Nouveau calendrier
  • modifier un calendrier existant en sélectionnant Modifier
  • supprimer un calendrier existant en sélectionnant Supprimer
  • définir la table en tant que table de dates en sélectionnant Marquer comme table de dates

Capture d’écran montrant les options de calendrier d’un tableau.

Affecter des catégories de colonnes

La définition d’un calendrier implique de lui attribuer un nom et d’affecter des colonnes à des catégories. Chaque catégorie représente une unité de temps et des catégories de colonnes spécifiques sont disponibles. Vous devez au moins affecter une colonne principale à une catégorie pour enregistrer votre calendrier. Chaque catégorie doit avoir une colonne principale et peut avoir zéro ou plusieurs colonnes associées. Chaque fois que les colonnes associées à une catégorie se trouvent dans le contexte, Power BI sait quelle unité de temps elles présentent. En outre, pour certaines fonctions telles que TOTALMTD Power BI utilise la colonne principale mappée à la catégorie appropriée dans le calendrier référencé pour effectuer le calcul demandé. Pour affecter une colonne à une catégorie, sélectionnez la catégorie dans le menu Ajouter une catégorie , puis sélectionnez les colonnes primaires et facultatives associées.

Capture d’écran montrant l’écran de création et de modification du calendrier.

Catégories de colonnes disponibles

Le tableau suivant présente les catégories disponibles. Le tableau donne également des exemples de valeurs et de cardinalités pour les calendriers grégoriens.

Les catégories sont divisées en deux groupes :

  • Terminé. Les données des colonnes affectées aux catégories Complete sont suffisantes pour identifier de manière unique la période.
  • Partiel. Les données des colonnes affectées aux catégories partielles ne suffisent pas pour identifier de manière unique la période.
Catégorie Descriptif Type Exemple de cardinalité dans un calendrier grégorien Exemples de valeurs de colonne dans un calendrier grégorien
Année Année Exécuter Y = nombre d’années 2024, 2025
Trimestre Trimestre compris l’année Exécuter 4*Y Q1 2024, Q2 2025
Trimestre d’année Le trimestre de l’année Partiel 4 Trimestre 1, YQ1, Q1, Trimestre 2
Mois Le mois incluant l'année Exécuter 12*Y ≤ value ≤ 13*Y Janvier 2023, 2024 Février
Mois de l’année Mois de l’année Partiel 12 Janvier, Mois 11, YM11, M11, 11
Mois du trimestre Mois du trimestre Partiel 3 1, QM2
Week La semaine, y compris l’année Exécuter 52 ≤ value ≤ 53 Semaine 50 2023, W50-2023, 2023-W50
Semaine de l’année La semaine de l’année Partiel 52 Semaine 50, W50, 50
Semaine du trimestre La semaine du trimestre Partiel 13 Semaine du Trimestre 10, QW10, 10
Semaine du mois La semaine du mois Partiel 5 Semaine 2 du mois, MW2, 2
Date La date Exécuter 365*Y ≤ value ≤ 366*Y 31/12/2025
Jour de l’année Jour de l’année Partiel 365 ≤ value ≤366 365, D1
Jour du trimestre Jour du trimestre Partiel 92 Jour du trimestre 10, QD2, 50
Jour du mois Jour du mois Partiel 31 Jour du mois 30, MD10, 30
Jour de la semaine Jour de la semaine Partiel 7 Jour de semaine 5, WD5, 5

En plus de ces catégories, vous pouvez associer n’importe quel nombre de colonnes de votre table à la catégorie liée à l’heure . Cela n’est pas possible actuellement dans les options de calendrier, mais peut uniquement être effectué à l’aide d’outils externes ou TMDL.

Note

Le contexte sur toutes les colonnes affectées à la catégorie liée au temps est supprimé lors de l’exécution de calculs dans toutes les fonctions à l’exception DATEADD et .SAMEPERIODLASTYEAR Tout contexte sur les colonnes qui font partie de la table sur laquelle le calendrier est défini, mais qui ne sont pas marquées dans le calendrier est conservé.

Note

Nous vous recommandons d’associer uniquement les colonnes de votre calendrier que vous souhaitez utiliser dans les calculs time intelligence.

Colonnes primaires et associées

La colonne principale est requise pour chaque catégorie. Chaque fois que cette colonne ou toutes les colonnes associées affectées à la même catégorie sur le calendrier référencé sont dans le contexte ou que la catégorie est nécessaire pour effectuer un calcul, Power BI utilise la colonne principale. En outre, les colonnes primaires sont utilisées pour le tri. Si les valeurs de la colonne primaire ne l’autorisent pas à être triables comme prévu, vous pouvez configurer la colonne primaire pour trier par une autre colonne ou utiliser une autre colonne et rendre la colonne d’origine une colonne associée. Par exemple, une colonne contenant des données textuelles contenant le numéro de mois et l’année dans un format de mm-yyyy (autrement dit, 01-2024, 02-2024et ainsi de suite) ne trie pas correctement sur plusieurs années, mais une colonne qui utilise le yyyy-mm format sera :

Capture d’écran montrant deux tables. Chaque table a une colonne. Le premier tableau contient une colonne qui contient le numéro de mois textuel et les informations d’année dans un format mm-aaaa et la seconde contient les mêmes informations au format aaaa-mm. La colonne contenant les données de format mm-aaaa n’est pas triée correctement.

Vous pouvez avoir zéro ou plusieurs colonnes associées affectées à une catégorie.

Validation

Il est important de valider et de tester votre calendrier afin que vous soyez certain qu’il répond à vos besoins. Les validations proposées dans Power BI incluent des validations en temps réel et des validations hors connexion.

Note

Vous pouvez enregistrer votre calendrier malgré les erreurs de validation hors connexion, mais il est recommandé de les résoudre d'abord. Pour pouvoir enregistrer, les échecs de validation en temps réel doivent être corrigés.

Validations en temps réel

Les validations en temps réel effectuées sur les calendriers sont les suivantes :

  • Nom de calendrier unique. Chaque calendrier doit avoir un nom unique dans le modèle sémantique.
  • Association unique par calendrier. Une colonne ne peut pas appartenir à plusieurs catégories dans le même calendrier.
  • Unicité de période. Les catégories affectées doivent identifier de manière unique la période.
  • Catégorisation cohérente. Cela garantit que les colonnes sont associées à la même catégorie entre les calendriers.

Unicité de période

Il doit toujours y avoir un chemin d’accès pour identifier de manière unique la période des catégories affectées.

Chaque fois que vous ajoutez une catégorie partielle, Power BI valide qu’une combinaison correspondante de catégories complètes ou partielles est également marquée dans le même calendrier. Si ce n’est pas le cas, un avertissement s’affiche.

Capture d’écran montrant la création et la modification du calendrier avec une erreur de validation en temps réel.

Par exemple, lors de la configuration d’un calendrier pour les calculs basés sur des semaines, veillez à affecter au moins une colonne primaire à l’un des ensembles de catégories suivants :

  • Week
  • Semaine de l’année, Année
  • Semaine du trimestre, trimestre
  • Semaine du trimestre, trimestre de l’année, année
  • Semaine du mois, mois
  • Semaine du mois, mois de l’année, année
  • Semaine du mois, mois du trimestre, trimestre
  • Semaine du mois, mois du trimestre, trimestre de l’année, année

Catégorisation cohérente

Les colonnes doivent avoir une catégorie cohérente entre les calendriers. Vous ne pouvez pas affecter la même colonne à différentes catégories telles que Année, Trimestre de l'année ou temps dans des calendriers séparés.

Validations hors connexion

Les validations hors connexion peuvent prendre du temps à mesure qu’elles accèdent aux données de table. Par conséquent, ils ne s’exécutent pas automatiquement contrairement aux validations en temps réel. Pour exécuter les validations, sélectionnez Valider les données :

Capture d’écran montrant l’écran de création et de modification du calendrier. Le bouton Valider les données est mis en surbrillance.

Les validations hors connexion vérifient les règles suivantes et retournent un avertissement si des règles sont invalidées dans votre calendrier :

  • une colonne associée à une catégorie n’a pas de valeurs vides.
  • les catégories de niveau supérieur et de niveau inférieur ont un ratio de cardinalité un-à-plusieurs. Par exemple, les colonnes associées à la catégorie Year doivent avoir une cardinalité de un à plusieurs avec des colonnes associées à la catégorie Mois.
  • les colonnes associées aux catégories du même niveau ont un rapport de cardinalité un-à-un. Par exemple, les colonnes associées à la catégorie Mois doivent avoir une cardinalité un-à-un avec les combinaisons des colonnes associées aux catégories Mois d’année et Année.
  • les colonnes primaires et associées affectées à la même catégorie ont un rapport de cardinalité un-à-un. Par exemple, lorsqu’il est affecté à la catégorie Mois, une colonne principale Month et une colonne associée EnglishMonthName doit avoir une cardinalité un-à-un.

Utiliser des calendriers

Une fois qu’un calendrier est défini, vous pouvez y faire référence dans les fonctions Time Intelligence. Par exemple, la mesure suivante calcule la valeur totale du mois jusqu'à ce jour pour la quantité totale par rapport au calendrier ISO-454 :

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

Si le calendrier n’est pas défini et que l’erreur est retournée :

Capture d’écran montrant une mesure utilisant la TOTALMTD fonction avec un paramètre de calendrier à un calendrier inexistant.

Même si le calendrier est défini, toutefois, une mesure peut toujours renvoyer une erreur. Cela se produit si la fonction utilisée s’attend à ce qu’une catégorie soit présente dans le calendrier et que le calendrier n’a pas cette catégorie. Par exemple, TOTALWTD s’attend à ce que des catégories spécifiques soient présentes dans le calendrier. Si ce n’est pas le cas, une erreur est retournée :

Capture d’écran montrant une mesure utilisant la TOTALWTD fonction avec une référence de calendrier valide qui ne définit pas les catégories requises.

Fonctions d'intelligence temporelle ainsi que les catégories requises

De nombreuses fonctions Time Intelligence nécessitent l’inclusion de catégories suffisantes dans le calendrier référencé dans l’appel de fonction afin que Power BI puisse identifier une unité de temps spécifique de manière unique. En d'autres termes, Power BI doit être en mesure de remonter depuis le niveau où le calcul est effectué jusqu'à une année spécifique. Par exemple, lors de l’exécution d’un calcul sur les trimestres, en utilisant TOTALQTD, affectez soit la catégorie trimestre, soit à la fois trimestre de l’année et année dans le calendrier, conformément à la validation de l’unicité de la période.

Note

Pour certaines fonctions, leur nom indique quel niveau le calcul fonctionne (par exemple), TOTALYTDtandis que pour d’autres, il dépend des paramètres et du contexte (par exemple, DATEADD).

Effacement du contexte

Les fonctions Time Intelligence fonctionnent en commençant à un point dans le temps, puis en effectuant une opération dessus afin de produire un point différent dans le temps. Naturellement, le point initial dans le temps peut entrer en conflit avec ce résultat, provoquant ainsi une intersection de contexte de filtre qui, par défaut, générerait des résultats partiels ou vides. Par exemple, prenez le scénario suivant :

Définition du calendrier

Nous avons un calendrier grégorien simple qui étiquette trois catégories, définies comme suit :

Catégorie Colonne principale
Année Année
Mois de l’année MoisDeLAnnee
Trimestre Trimestre

Définitions de mesure

Deux mesures de base sont définies : une pour calculer le total des ventes, et une autre pour calculer le total des ventes du trimestre précédent :

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

Exemple : Comment fonctionne l'effacement du contexte

Notre visuel de tableau recherche une granularité de mois à l’aide des colonnes Year et MonthOfYear :

Année MoisDeLAnnee Ventes totales Ventes du dernier trimestre
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

Dans ce tableau, la ligne mise en gras correspond à un affichage au niveau mensuel, pour le mois d'avril 2011. Ainsi, toutes les mesures de cette ligne seront évaluées sous le contexte de filtre de [Year] == 2011 et [MonthOfYear] == 4.
Comme prévu, TotalSales est calculé en tant que ventes totales pour avril 2011.

LastQuarterSales calcule de la même façon TotalSales, mais en fonction d’un filtre supplémentaire fourni par la fonction basée sur le DATEADD calendrier. Pour cette ligne, DATEADD aurait comme point de départ initial à partir d'avril 2011 et produirait le moment dans le temps exactement un trimestre auparavant : janvier 2011. Par conséquent, on peut s’attendre à ce que ce TotalSales soit calculé sous les deux contextes de filtre suivants :

  • Fourni par les colonnes de navigation de la ligne actuelle : { [Year] == 2011, [MonthOfYear] == 4 } (Équivalent, avril 2011)
  • Fourni par le DATEADD filtre : { [Year] == 2011, [MonthOfYear] == 1 } (Équivalent, janvier 2011)

Il est clair que ces deux contextes de filtre sont en conflit : nous ne pouvons pas évaluer le total des ventes en fonction du mois actuel comme janvier 2011 et avril 2011. Une telle intersection ne donnerait aucun résultat. Toutefois, ce n’est pas ce qui se produit. Au lieu de cela, en fonction de la définition du calendrier, les fonctions d’intelligence temporelle basées sur le calendrier identifient les colonnes des catégories qui peuvent entraîner des conflits, après l’opération de temps effectuée par la fonction. Dans ce cas, DATEADD effectue un décalage au niveau Trimestre . La fonction identifie que les catégories Année et Mois d’Année peuvent changer en raison d’une modification dans les colonnes de la catégorie Trimestre . Par conséquent, la fonction efface le contexte de filtre sur toutes les colonnes (primaires et associées) marquées dans ces catégories.

En d’autres termes, nous pouvons dire que les catégories Année et Mois d’Année sont des dépendances de la catégorie Trimestre . À l’inverse, nous pouvons dire que la catégorie Trimestre dépend des catégories Année et Mois de l’Année .

Fonctionnement de l’effacement du contexte

Diagramme de structure lattice de toutes les catégories de calendrier.

Ce diagramme est fourni pour mieux visualiser les dépendances entre les différentes catégories de temps. Chaque catégorie de ce réseau représente toutes les colonnes (primaires et associées) marquées dans cette catégorie. Les catégories sont connectées à leurs dépendances via des flèches. Par exemple, « Mois » dépend de « Année », « Trimestre de l'Année », « Mois du Trimestre », « Trimestre » et « Mois de l'Année ».

Lorsque le contexte est défini sur une colonne ou sa colonne de tri associée étiquetée dans un calendrier, le contexte de filtre précédent est effacé sur :

  1. Toutes les dépendances de catégorie de X. Cela peut être considéré comme toutes les catégories au-dessus de X.
  2. Tous les dépendants catégoriels de X et de ses dépendances (c’est-à-dire, à partir de 1. ci-dessus). Cela peut être considéré comme toutes les catégories inférieures à X et toutes les catégories dans 1 ci-dessus.

Note

L’effacement du contexte se produit sur les colonnes marquées dans un calendrier ou des colonnes de tri associées , que le contexte soit défini à l’aide de fonctions d’intelligence temporelle ou autrement.

La plupart des fonctions d’intelligence temporelle, à l’exception de DATEADD et SAMEPERIODLASTYEAR, effacent le contexte sur toutes les colonnes temporelles et les colonnes de tri associées.

Comportement inter-calendrier

S’il existe plusieurs calendriers définis sur la même table, ces processus sont terminés pour chaque calendrier défini sur la table. Cela inclut la remarque concernant le nettoyage du contexte des colonnes temporelles. En d’autres termes, supposons qu’une table définit trois calendriers : Calendar1, Calendar2 et Calendar3. Si le contexte de filtre est défini sur la catégorie « X » dans Calendar1, les processus ci-dessus sont effectués sur les trois calendriers.

Exemple : Filtre défini sur « Quarter »

Si le contexte de filtre a été défini sur la catégorie « Quarter », le processus est le suivant.

  1. Tout d’abord, toutes les dépendances de la catégorie « Quarter » seraient prises en compte.

    Exemple de comportement d’effacement du contexte de filtre à partir de la catégorie Trimestre : Dépendances.

  2. Ensuite, tous les dépendants de « Quarter » et ses dépendances seraient pris en compte.

    Exemple de comportement d’effacement du contexte de filtre à commencer par la catégorie Trimestre : Dépendants.

  3. Enfin, le résultat final serait le suivant. Toutes les catégories de couleurs rouges auront leur contexte de filtre précédent supprimé et le nouveau contexte est défini sur Quarter.

    Exemple de comportement d’effacement du contexte de filtre depuis la catégorie 'Trimestre' : résultats

Script TMDL pour les calendriers

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

Note

Notez que si vous ne spécifiez aucune catégorie pour le modèle TMDL calendarColumnGroup, les colonnes sont marquées comme liées au temps. Dans cet exemple, Holiday Name et isWorkingDay sont des colonnes liées au temps dans le calendrier de démonstration.

Mettre tout cela ensemble : exemples de décalage de temps

Certaines fonctions d'intelligence temporelle déplacent le contexte uniquement latéralement, en tenant compte de toutes les colonnes, tandis que d'autres effectuent des décalages hiérarchiques, en conservant ou en effaçant le contexte en fonction de l'identification des colonnes dans le calendrier. Les fonctions d’intelligence temporelle peuvent être divisées en deux groupes selon qu’elles permettent des décalages hiérarchiques :

  • Correction. Les fonctions de ce groupe sont DATEADD et SAMEPERIODLASTYEAR. Ces fonctions autorisent uniquement les décalages de temps latéral et ne retournent pas de valeurs d’un niveau de détail différent.
  • Flexible. Ce groupe contient toutes les autres fonctions d’intelligence temporelle. Ces fonctions permettent des décalages hiérarchiques de temps et, selon la configuration du calendrier, les résultats peuvent être retournés à partir d’un niveau de détail différent.

Pour afficher ces comportements, examinons un exemple utilisant un modèle de données simple composé de deux tables, deux calendriers et cinq mesures.

Tables et relations

Pour cet exemple, nous avons le modèle de données simple suivant :

Table Columns
Date Année, EstJourOuvrable, Date
Ventes OrderKey, Quantité, Date de commande

Voici quelques exemples de lignes dans la table Date : capture d’écran montrant les 14 premières lignes de l’exemple de table Date. La table définit Date, Year et IsWorkingDay. La colonne Date contient une date, la colonne Year la valeur de l’année et la colonne IsWorkingDay est une colonne booléenne (True/False) qui indique si la date est un jour ouvré ou non.

Voici quelques exemples de lignes dans la table Sales : capture d’écran montrant les neuf premières lignes de l’exemple de table Sales. La table définit OrderKey, OrderDate et Order Quantity. La colonne OrderKey contient un numéro unique pour chaque commande, orderDate est une date qui concerne Sales to Date et la Quantité de commande est une colonne numérique qui représente le nombre de produits pour chaque commande.

Les tables Sales et Date sont reliées par OrderDate et Date.

Capture d’écran montrant l’affichage du modèle pour l’exemple de modèle. Il affiche la table Sales et Date et une relation un-à-plusieurs entre elles sur OrderDate et Date.

Calendars

Dans la table Date , nous avons défini des calendriers avec ces mappages :

NomDuCalendrier Catégorie Colonne principale
Grégorien Année Année
Date Date
GrégorienAvecJourOuvré Année Année
Date Date
Lié au temps IsWorkingDay

La définition TMDL équivalente de ces deux calendriers est la suivante :

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   

Mesures

Dans la table Sales , nous définissons les mesures suivantes :

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 )
)

Exemple de décalage latéral

Créons un visuel qui montre Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity et OneYearAgoQuantityTimeRelated pour 2024 et 2025 :

Capture d’écran montrant un visuel de tableau montrant Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity et OneYearAgoQuantityTimeRelated. Les valeurs de OneYearAgoQuantity et OneYearAgoQuantityTimeRelated pour 2025 correspondent aux valeurs de 2024 pour les mêmes valeurs IsWorkingDay.

Toutes les valeurs de OneYearAgoQuantity et OneYearAgoQuantityTimeRelated pour 2025 correspondent à la quantité totale d’un an avant (2024) pour la même valeur IsWorkingDay .

Cela montre que DATEADD conserve précisément le contexte sur n’importe quelle colonne de la table Date contenant le calendrier utilisé, qu’elle soit étiquetée ou non, ou étiquetée comme associée au temps sur ce calendrier. Étant donné que dans nos définitions de mesure , nous avons demandé DATEADD de reculer d’une année, la seule colonne dont le contexte a été décalé était la colonne associée à la catégorie Year. Si la colonne IsWorkingDay a été marquée dans le calendrier comme étant liée à l’heure ou non étiquetée du tout n’a pas modifié le résultat. La seule autre fonction qui présente ce comportement est SAMEPERIODLASTYEAR.

Exemple de décalage hiérarchique

Examinons maintenant un exemple dans lequel le fait qu'une colonne soit marquée comme liée au temps ou non change effectivement le résultat.

Pour cela, nous allons recréer le même visuel que dans l’exemple précédent, mais cette fois, nous allons utiliser les mesures FullLastYearQuantity et FullLastYearQuantityTimeRelated : capture d’écran montrant un visuel de table qui montre Year, IsWorkingDay, Total Quantity, FullLastYearQuantity et FullLastYearQuantityTimeRelated. Les valeurs de FullLastYearQuantity 2025 correspondent aux valeurs de 2024 pour les mêmes valeurs IsWorkingDay, mais les valeurs de FullLastYearQuantityTimeRelated sont égales à la valeur de quantité totale, quelles que soient les valeurs IsWorkingDay.

Cela montre que PARALLELPERIOD préserve le contexte pour les colonnes qui ne sont pas étiquetées dans le calendrier, mais efface le contexte de celles étiquetées comme étant liées au temps. FullLastYearQuantity a utilisé le calendrier grégorien où IsWorkingDay n’a pas été marqué dans le calendrier, tandis que FullLastYearQuantityTime Related a utilisé le calendrier GregorianWithWorkingDay où IsWorkingDay a été marqué comme étant lié au temps. Toutes les fonctions d’intelligence temporelle sauf DATEADD et SAMEPERIODLASTYEAR se comportent de cette façon.

Bonus : Si vous souhaitez vraiment forcer ces fonctions à conserver le contexte pour les colonnes liées au temps, vous pouvez également utiliser VALUES:

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

Dans ce cas, FullLastYearQuantityTimeRelatedOverride retourne les mêmes résultats que FullLastYearQuantity.

Conclusion

L’exemple élaboré ci-dessus montre que différentes fonctions d’intelligence temporelle se comportent différemment selon que les colonnes sont marquées comme liées au temps dans le calendrier. DATEADD et SAMEPERIODLASTYEAR effectuent uniquement des décalages temporels latéraux. Toutes les autres fonctions d’intelligence temporelle permettent des décalages de temps hiérarchiques.

Utiliser DATEADD avec des calendriers

La DATEADD fonction a des paramètres spécifiques qui permettent un contrôle précis sur la façon dont les décalages sont effectués lorsque la sélection est sur un niveau plus granulaire que le niveau de décalage indiqué par interval le paramètre dans DATEADD. Cela se produit, par exemple, si vous affichez des données au niveau de la date, mais définissez le interval paramètre DATEADD sur MONTH. Par exemple, dans un calendrier grégorien, lorsqu'on décale d'un mois une période s'étendant du 3 au 10 mars, cela donne du 3 au 10 avril. Toutefois, étant donné que les mois dans les calendriers grégoriens varient en longueur, cela peut entraîner des ambiguïtés lors du déplacement. Voici des exemples de scénarios basés sur un calendrier grégorien :

Passer d’une période plus courte à une période plus longue

Par exemple, avancer d'un mois avec une sélection en février, de sorte que le mois cible soit mars. Vous pouvez utiliser le extension paramètre pour influencer la façon dont le décalage est effectué :

Valeur du paramètre d’extension Descriptif Résultat
precise Cela conserve strictement la plage de dates d’origine. Le 25-28 février est déplacé vers le 25-28 mars.
extended Permet à la fenêtre de se développer vers la fin du mois. Le 25-28 février est déplacé vers le 25-31 mars.

Passer d’une période plus longue à une période plus courte

Par exemple, en vous déplaçant d'un mois en arrière avec une sélection en mars, le mois cible devient donc février.

Vous pouvez utiliser le truncation paramètre pour influencer la façon dont le décalage est effectué :

Valeur du paramètre de troncation Descriptif Résultat
anchored Ancre le résultat à la dernière date valide du mois le plus petit. Le 31 mars est passé au 28 février (ou 29 en année bissextile).
blank Lorsqu’une date décalée n’existe pas, renvoyez une valeur vide. Déplacer le 31 mars un mois en arrière renvoie vide (puisque le 31 février n’existe pas).

Considérations relatives à l’utilisation de l’intelligence temporelle basée sur le calendrier

  • Effectuer un calcul d’intelligence temporelle sur une table de faits qui définit un calendrier et est soumis à des règles de sécurité au niveau des lignes (RLS) et peut entraîner des résultats inattendus.
  • Les performances de cette fonctionnalité en préversion ne sont pas représentatives du produit final.
  • Vous ne pouvez pas encore créer de calendriers dans le service Power BI.
  • Vous ne devez pas utiliser de tables de date/heure automatiques avec des calendriers personnalisés.
  • Vous ne pouvez pas utiliser de calendriers avec des modèles connectés ou composites en temps réel.
  • Nous vous recommandons d’associer uniquement les colonnes de votre calendrier que vous souhaitez utiliser dans les calculs time intelligence.
  • Les calendriers sont soumis à des validations en temps réel et hors connexion . Vous pouvez enregistrer votre calendrier malgré les erreurs de validation hors connexion, mais il est recommandé de les résoudre d'abord. Pour pouvoir enregistrer, les échecs de validation en temps réel doivent être corrigés.
  • Chaque calendrier doit avoir un nom unique dans le modèle de données
  • Une seule table peut contenir plusieurs calendriers
  • La table qui contient le calendrier doit comporter moins de 200 colonnes. Si la table contient plus de 20 000 lignes, les validations ne seront pas disponibles, mais vous pouvez toujours ajouter un calendrier.
  • Un calendrier doit au moins affecter une colonne principale à une catégorie
  • Un calendrier peut uniquement affecter des colonnes de sa propre table aux catégories
  • Chaque catégorie doit avoir une colonne primaire et peut avoir zéro ou plusieurs colonnes associées affectées
  • DATEADD a de nouveaux paramètres pour contrôler l'extension et le comportement de l'extension, qui ne sont pas reconnus dans IntelliSense.
  • Toute colonne donnée ne peut être mappée qu’à une seule catégorie
  • Vous ne pouvez pas imbriquer les fonctions d’intelligence temporelle qui utilisent des calendriers. Par exemple, la déclaration DAX suivante n'est pas compatible :
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Au lieu de cela, vous pouvez effectuer les actions suivantes :

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

Créer une table de dates à l’aide d’outils intégrés

Les exemples suivants créent une table de dates du 1er janvier 2010 au 31 décembre 2030 à l’aide de Power Query M ou DAX. Elle inclut les colonnes suivantes : Année, Numéro de mois, Nom du mois, Année du mois, Trimestre, Trimestre de l'année, Jour et Date.

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]
)

Pour plus d'informations et plus d'options, consultez les tables de dates.

Pour plus d’informations sur cet article, consultez les ressources suivantes :