Delen via


Op tijd gebaseerde berekeningen implementeren in Power BI

Power BI biedt meerdere hulpprogramma's voor het uitvoeren van op tijd gebaseerde berekeningen, die afhankelijk zijn van automatische datumtabellen of datumtabellen die u toevoegt.

We raden u aan om time intelligence (preview) op basis van een agenda te gebruiken, omdat het de beste prestaties en het hoogste flexibiliteitsbereik biedt om aan elke agenda te voldoen.

In deze tabel worden de drie beschikbare hulpprogramma's vergeleken:

Tool Benodigde inspanning voor installatie Beheergemak Flexibiliteit Opmerkingen
Automatische datum/tijd vrijwel nul moeilijk laag Vergroot de modelgrootte vanwege meerdere verborgen datumtabellen die zijn gemaakt
Klassieke tijdsintelligentie medium gemakkelijk laag Vereist het maken van een datumtabel, waarbij ervan uitgegaan wordt dat er een Gregoriaanse of verplaatste Gregoriaanse kalender wordt gebruikt, en ondervindt in sommige specifieke scenario's prestatieproblemen.
Tijdintelligentie op basis van agenda hoog medium hoog Aanbevolen voor het maken van een datumtabel, de hoogste flexibiliteit, de beste prestaties, maar verhoogde installatiekosten

Opmerking

We raden af om alternatieve time intelligence-technieken te gebruiken, vooral technieken waarbij extra kolommen aan datumtabellen moeten worden toegevoegd om offsets te berekenen, behalve in specifieke gevallen. Hoewel deze benaderingen een beroep kunnen doen op beginners vanwege hun eenvoudige DAX-formules, worden semantische modellen vaak onnodig vergroot. Deze bloating kan leiden tot tragere gegevensvernieuwingen en verminderde rapportprestaties naarmate gegevenssets toenemen.

Automatische datum/tijd

Met de functie automatische datum/tijd worden automatisch verborgen datumtabellen gemaakt voor elk datumveld in uw gegevensmodel. Zie Automatische datum/tijd toepassen in Power BI Desktop voor meer informatie over dit automatische gedrag.

Opmerking

Hoewel automatische datum/tijd een handige optie is voor eenvoudige modellen, wordt het niet aanbevolen voor complexere scenario's en grotere modellen. Voor deze modellen is het raadzaam om een speciale tabel te maken voor meer flexibiliteit.

Een datumtabel toevoegen

Voor de meeste modellen is het raadzaam om een datumtabel (of meer in sommige scenario's) toe te voegen. Veel gegevensanalisten maken liever hun eigen datumtabellen, wat prima is.

Er zijn meerdere manieren om een dergelijke tabel te maken, waaronder:

Welke optie het beste voor u is, is afhankelijk van verschillende factoren en valt buiten het bereik van deze zelfstudie.

Werken met berekeningen op basis van tijd

Ervan uitgaande dat u geen automatische datum/tijd gebruikt, zijn er twee alternatieve manieren om met Time intelligence-functies in Power BI te werken om berekeningen op basis van tijd uit te voeren:

  • Klassieke tijdintelligentie. De eenvoudigste optie en werkt uitstekend voor Gregoriaanse of verplaatste Gregoriaanse kalenders, maar heeft beperkte flexibiliteit voor kalenders die verschillend zijn gestructureerd of voor op week gebaseerde berekeningen.
  • Tijdintelligentie op basis van een agenda (preview). Nieuwere optie, maar vereist wat meer werk om in te stellen. Het biedt echter ook betere prestaties, meer flexibiliteit om te werken met niet-Gregoriaanse kalenders en de mogelijkheid om op week gebaseerde berekeningen uit te voeren.

Opmerking

U moet uw tabel instellen als een datumtabel voor specifieke scenario's.

Klassieke tijdintelligentie

Voor deze optie moet u een datumtabel in uw model hebben en deze dienovereenkomstig instellen. Daarna kunt u de time intelligence-functies gebruiken en verwijzen naar uw datumtabel. Als u bijvoorbeeld een datumtabel hebt met de naam Date in uw model die u hebt ingesteld als de datumtabel, die een datumkolom bevat, kunt u het volgende gebruiken:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Hoewel dit een snelle en eenvoudige aanpak is, zijn er veel nadelen ten opzichte van de op agenda gebaseerde benadering:

  • Hiervoor moet u de datumtabel instellen
  • het werkt alleen met modellen met ten minste één toegewezen datumtabel
  • de gebruikte datumkolommen mogen geen ontbrekende datums hebben tussen de eerste en laatste datum. Als er datums ontbreken tussen de eerste en laatste datum, treedt er een fout op.
  • het is minder flexibel omdat het is geoptimaliseerd voor Gregoriaanse of verplaatste Gregoriaanse kalenders, zoals fiscale jaren die beginnen op 1 juli, maar nog steeds een Gregoriaanse kalender volgen
  • het biedt geen op week gebaseerde berekeningen
  • in specifieke scenario's presteren tijdberekeningen niet goed.

Opmerking

U wordt aangeraden de verbeterde benadering op basis van agenda's te gebruiken.

Kalendergebonden tijdintelligentie (preview)

Agenda's zijn metagegevensdefinities die zijn toegevoegd aan een tabel om aan te geven welke kolommen uit die tabel aangeven welke kenmerken van tijd. U kunt een of meer agenda's definiëren voor elke tabel in uw model. Nadat u de kalender in uw model hebt gedefinieerd, kunt u ernaar verwijzen in uw time-intelligence-functies. U kunt bijvoorbeeld als volgt een totaal jaar tot datum van verkoop berekenen met behulp van een gedefinieerde fiscale kalender:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Voordelen van time intelligence op basis van agenda's

De belangrijkste voordelen van time intelligence op basis van agenda's zijn:

Werkt met elke agenda

Agenda's bieden u volledige flexibiliteit om te bepalen hoe u de tijd in jaren, kwartalen, maanden en weken kunt verdelen. U kunt bijvoorbeeld de agenda's definiëren die deze patronen volgen:

  • Gregorian
  • Verschoven Gregoriaanse kalender
  • Detailhandel (445, 454, 544 patronen)
  • 13 maanden
  • Lunaire

De mogelijkheden zijn eindeloos omdat er geen ingebouwde aanname van Power BI is over de structuur van uw agenda. Tijdintelligentie op basis van een kalender maakt geen aannames over de onderliggende datums. Alle berekeningen gebruiken de onderliggende gegevens precies zoals ze zijn.

Spaarzame data

Klassieke tijdintelligentie vereist dat de opgegeven datumkolom volledig is. Als er datums ontbreken tussen de eerste en laatste datum, wordt er een fout gegenereerd. Op agenda's gebaseerde time intelligence-functies hebben niet zo'n vereiste. In plaats daarvan werken ze op de data zoals ze zijn. Hoewel het nog steeds raadzaam is om een volledige en toegewezen agendatabel te hebben, hoeft u dat niet meer te hebben. Als bijvoorbeeld al uw winkels in het weekend gesloten zijn, kunt u de weekenddagen overslaan omdat ze geen verkopen hebben. Ervan uitgaande dat uw weekend zaterdag en zondag is, kunt u nu een kalender gebruiken PREVIOUSDAY op basis van een tabel die geen vermeldingen voor het weekend heeft om van maandag tot en met vrijdag te springen.

Op week gebaseerde berekeningen

Tijdintelligentie op basis van een kalender levert rechtstreeks DAX-functies die op een weekgranulariteit werken. Bijvoorbeeld: totalen van week tot heden kunnen rechtstreeks worden berekend met behulp van TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Prestatieverbeteringen

Sommige scenario's kunnen verbeterde prestaties vertonen bij het vergelijken van een time intelligence-functie op basis van een kalender met de klassieke tegenhanger. Een visual die bijvoorbeeld gegroepeerd is op week en een jaar-tot-datumberekening uitvoert met behulp van TOTALYTD ( ..., CalendarName ), moet over het algemeen sneller worden uitgevoerd dan wanneer de klassieke tegenhanger, TOTALYTD ( ..., TableName[DateColumnName] ), wordt gebruikt. Raadpleeg de sectie Context wissen voor inzicht in waarom dit kan gebeuren.

De verbeterde PREVIEW van DAX Time Intelligence inschakelen

Om aan de slag te gaan, moet u eerst de verbeterde DAX Time Intelligence previewfunctie inschakelen.

  1. Ga in Power BI Desktop naar Bestand > Opties en instellingen > Opties > Previewfuncties.
  2. Selecteer de preview-versie van Enhanced DAX Time Intelligence .
  3. Selecteer OK
  4. Power BI Desktop opnieuw starten

Agenda's beheren

Als u een agenda wilt beheren, klikt u met de rechtermuisknop op de tabel die de agenda bevat of waarop u de agenda wilt definiëren en kiest u agendaopties of selecteert u agendaopties in het lint Hulpmiddelen voor tabellen nadat u de tabel hebt geselecteerd:

Schermopname van de toegangspunten om de agendaopties in een tabel te openen.

U kunt ook externe hulpprogramma's of de TMDL-weergave gebruiken om een agenda te definiëren. Zie het TMDL-script voor meer informatie.

Agenda's worden ook weergegeven in de modelverkenner onder de tabel waarop ze zijn gedefinieerd:

Schermopname van de modelverkenner voor een semantisch model. Het knooppunt Datumtabel is uitgevouwen en de agenda's zijn gemarkeerd.

Het scherm agendaopties

In het scherm agendaopties worden de agenda's weergegeven die zijn gedefinieerd in de geselecteerde tabel. Hier kunt u het volgende doen:

  • een nieuwe agenda maken door Nieuwe agenda te selecteren
  • een bestaande agenda bewerken door Bewerken te selecteren
  • een bestaande agenda verwijderen door Verwijderen te selecteren
  • de tabel instellen als een datumtabel door Markeren als datumtabel te selecteren

Schermopname van de agendaopties in een tabel.

Kolomcategorieën toewijzen

Het definiëren van een agenda omvat het geven van een naam en het toewijzen van kolommen aan categorieën. Elke categorie vertegenwoordigt een tijdseenheid en specifieke kolomcategorieën zijn beschikbaar. U moet ten minste één primaire kolom toewijzen aan een categorie om uw agenda op te slaan. Elke categorie moet een primaire kolom hebben en kan nul of meer gekoppelde kolommen hebben. Wanneer kolommen die aan een categorie zijn gekoppeld, zich in context bevinden, weet Power BI welke tijdseenheid ze presenteren. Daarnaast wordt voor sommige functies zoals TOTALMTD Power BI de primaire kolom gebruikt die is toegewezen aan de relevante categorie in de agenda waarnaar wordt verwezen om de aangevraagde berekening uit te voeren. Als u een kolom aan een categorie wilt toewijzen, selecteert u de categorie in het menu Categorie toevoegen en selecteert u vervolgens de primaire en optionele gekoppelde kolommen.

Schermopname van het scherm voor het maken en bewerken van de agenda.

Beschikbare kolomcategorieën

In de volgende tabel ziet u de categorieën die beschikbaar zijn. De tabel bevat ook voorbeeldwaarden en kardinaliteiten voor Gregoriaanse kalenders.

Categorieën zijn onderverdeeld in twee groepen:

  • Voltooid. Gegevens in kolommen die zijn toegewezen aan Complete-categorieën zijn voldoende om de periode uniek te identificeren.
  • Gedeeltelijk. Gegevens in kolommen die zijn toegewezen aan gedeeltelijke categorieën zijn niet voldoende om de periode uniek te identificeren.
Categorie Description Typologie Voorbeeldkardinaliteit in een Gregoriaanse kalender Voorbeeldkolomwaarden in een Gregoriaanse kalender
Jaar Het jaar Complete Y = aantal jaren 2024, 2025
Kwartaal Het kwartaal inclusief het jaar Complete 4*Y K1 2024, K2 2025
Kwartaal van het jaar Het kwartaal van het jaar Gedeeltelijk 4 Jaar kwartaal 1, YQ1, Q1, kwartaal 2
Maand De maand inclusief het jaar Complete 12*Y ≤ value ≤ 13*Y Januari 2023, Februari 2024
Maand van het jaar De maand van het jaar Gedeeltelijk 12 Januari, Jaar maand 11, YM11, M11, 11
Maand van kwartaal De maand van het kwartaal Gedeeltelijk 3 1, QM2
Week De week inclusief het jaar Complete 52 ≤ value ≤ 53 Week 50 2023, W50-2023, 2023-W50
Week van het jaar De week van het jaar Gedeeltelijk 52 Week 50, W50, 50
Week van kwartaal De week van het kwartaal Gedeeltelijk 13 Kwartaalweek 10, QW10, 10
Week van maand De week van de maand Gedeeltelijk 5 Maand Week 2, MW2, 2
Datum De datum Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
Dag van het Jaar De dag van het jaar Gedeeltelijk 365 ≤ value ≤366 365, D1
Dag van het kwartaal De dag van het kwartaal Gedeeltelijk 92 Kwartaaldag 10, QD2, 50
Dag van de maand De dag van de maand Gedeeltelijk 31 Maanddag 30, MD10, 30
Dag van de week De dag van de week Gedeeltelijk 7 Weekdag 5, WD5, 5

Naast deze categorieën kunt u een willekeurig aantal kolommen in uw tabel koppelen aan de categorie Tijd . Dit is momenteel niet mogelijk in de agendaopties, maar kan alleen worden gedaan met behulp van externe hulpprogramma's of TMDL.

Opmerking

Context voor kolommen die zijn toegewezen aan de tijdgerelateerde categorie, wordt verwijderd bij het uitvoeren van berekeningen in alle functies, behalve DATEADD en SAMEPERIODLASTYEAR. Context voor kolommen die deel uitmaken van de tabel waarop de agenda is gedefinieerd, maar die niet in die agenda worden gelabeld, wordt bewaard.

Opmerking

U wordt aangeraden alleen de kolommen in uw agenda te koppelen die u wilt gebruiken in time intelligence-berekeningen.

Primaire versus gekoppelde kolommen

De primaire kolom is vereist voor elke categorie. Wanneer die kolom of gekoppelde kolommen die zijn toegewezen aan dezelfde categorie in de agenda waarnaar wordt verwezen, zich in context bevinden of als de categorie is vereist om een berekening uit te voeren, gebruikt Power BI de primaire kolom. Daarnaast worden de primaire kolommen gebruikt voor het sorteren. Als de waarden in de primaire kolom niet mogen worden gesorteerd zoals verwacht, kunt u de primaire kolom configureren om te sorteren op een andere kolom of een andere kolom gebruiken en de oorspronkelijke kolom een gekoppelde kolom maken. Een kolom met tekstgegevens met maandnummer en jaar in een notatie van mm-yyyy (dat wil 01-2024gezegd, 02-2024enzovoort) sorteert bijvoorbeeld niet correct over meerdere jaren, maar een kolom die de yyyy-mm notatie gebruikt, doet het volgende:

Schermopname van twee tabellen. Elke tabel heeft één kolom. De eerste tabel bevat een kolom met tekstuele maandnummer- en jaargegevens in een mm-jjjjnotatie en de tweede bevat dezelfde informatie in een jjjj-mm-notatie. De kolom met de mm-jjjj-indelingsgegevens wordt niet correct gesorteerd.

U kunt nul of meer gekoppelde kolommen toewijzen aan een categorie.

Validation

Het is belangrijk om uw agenda te valideren en te testen, zodat u zeker weet dat deze aan uw behoeften voldoet. De validaties die in Power BI worden aangeboden, bevatten zowel realtime validaties als offlinevalidaties.

Opmerking

U kunt uw agenda opslaan ondanks offlinevalidatiefouten, maar het wordt aanbevolen deze eerst op te lossen. Validatiefouten in realtime moeten worden hersteld om te kunnen opslaan.

Realtime validaties

De realtime validaties die in de agenda's worden uitgevoerd, zijn:

  • Unieke kalendernaam. Elke agenda moet een unieke naam hebben in het semantische model.
  • Eén koppeling per agenda. Een kolom kan niet tot meer dan één categorie in dezelfde agenda behoren.
  • Uniekheid van periode. Toegewezen categorieën moeten de periode uniek identificeren.
  • Consistente categorisatie. Dit zorgt ervoor dat kolommen zijn gekoppeld aan dezelfde categorie in agenda's.

Uniekheid van periode

Er moet altijd een pad zijn om de periode voor de toegewezen categorieën uniek te identificeren.

Wanneer u een gedeeltelijke categorie toevoegt, wordt in Power BI gevalideerd dat een overeenkomende combinatie van volledige of gedeeltelijke categorieën ook in dezelfde agenda wordt gelabeld. Als dat niet het geval is, wordt er een waarschuwing weergegeven.

Schermopname van het scherm voor het maken en bewerken van de agenda met een realtime validatiefout.

Als u bijvoorbeeld een kalender instelt voor op week gebaseerde berekeningen, moet u ten minste een primaire kolom toewijzen aan een van de volgende sets categorieën:

  • Week
  • Week van het jaar, Jaar
  • Week van het kwartaal, Kwartaal
  • Week van kwartaal, kwartaal van jaar, jaar
  • Week van maand, maand
  • Week van de maand, maand van het jaar, jaar
  • Week van maand, maand van kwartaal, kwartaal
  • Week van maand, maand van kwartaal, kwartaal van jaar, jaar

Consistente categorisatie

Kolommen moeten in alle agenda's een consistente categorie zijn. U kunt dezelfde kolom niet toewijzen aan verschillende categorieën, zoals Year, Kwartaal van het Jaar of Tijdgerelateerd in afzonderlijke kalenders.

Offline-validaties

Offlinevalidaties kunnen mogelijk tijdrovend zijn wanneer ze toegang hebben tot tabelgegevens. Daarom worden ze niet automatisch uitgevoerd in tegenstelling tot de realtime validaties. Als u de validaties wilt uitvoeren, selecteert u Gegevens valideren:

Schermopname van het scherm voor het maken en bewerken van de agenda. De knop Gegevens valideren is gemarkeerd.

De offlinevalidaties controleren de volgende regels en retourneert een waarschuwing als er regels ongeldig zijn in uw agenda:

  • een kolom die is gekoppeld aan een categorie, heeft geen lege waarden.
  • Categorieën op een hoger niveau en lager niveau hebben een één-op-veel-kardinaliteitsverhouding. Kolommen die zijn gekoppeld aan de categorie Jaar moeten bijvoorbeeld een een-op-veel-kardinaliteit hebben met kolommen die zijn gekoppeld aan de categorie Maand.
  • kolommen die aan categorieën op hetzelfde niveau zijn gekoppeld, hebben een een-op-een-kardinaliteitsverhouding. Kolommen die zijn gekoppeld aan de categorie Maand, moeten bijvoorbeeld een een-op-een-kardinaliteit hebben met de combinaties van de kolommen die zijn gekoppeld aan de categorieën Maand van het Jaar en Jaar.
  • primaire en gekoppelde kolommen die aan dezelfde categorie zijn toegewezen, hebben een een-op-een-kardinaliteitsverhouding. Wanneer deze bijvoorbeeld is toegewezen aan de categorie Maand, moeten de primaire kolom Maand en de bijbehorende kolom EnglishMonthName een een-op-een-kardinaliteit hebben.

Werken met agenda's

Zodra een kalender is gedefinieerd, kunt u ernaar verwijzen in Time Intelligence-functies. De volgende maatregel berekent bijvoorbeeld een totale maand-tot-datum waarde van totale hoeveelheid op basis van de ISO-454-kalender.

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

Als de agenda niet is gedefinieerd, wordt er een fout geretourneerd.

Schermopname van een meting met behulp van de TOTALMTD functie met een kalenderparameter voor een niet-bestaande agenda.

Zelfs als de kalender is gedefinieerd, kan een meting nog steeds een fout geven. Dit gebeurt als de gebruikte functie verwacht dat een categorie aanwezig is in de agenda en de agenda niet over die categorie beschikt. Verwacht bijvoorbeeld TOTALWTD dat specifieke categorieën aanwezig zijn in de agenda. Als dat niet het geval is, wordt er een fout geretourneerd:

Schermopname van een meting met behulp van de TOTALWTD functie met een geldige kalenderreferentie waarmee de vereiste categorieën niet worden gedefinieerd.

Tijdintelligentie-functies en benodigde categorieën

Voor veel Time intelligence-functies moeten voldoende categorieën worden opgenomen in de agenda waarnaar wordt verwezen in de functieoproep, zodat Power BI een unieke specifieke tijdseenheid kan identificeren. Met andere woorden, Power BI moet kunnen opklimmen vanaf het niveau waarop de berekening wordt uitgevoerd naar een afzonderlijk jaar. Wanneer u bijvoorbeeld een berekening uitvoert op kwartalen, bijvoorbeeld door TOTALQTD de categorie Kwartaal toe te wijzen of zowel kwartaal van jaar als jaar in de kalender toe te wijzen, zoals bepaald door de validatie van de uniekheidsperiode .

Opmerking

Voor sommige functies geeft hun naam aan welk niveau de berekening werkt (bijvoorbeeld TOTALYTD), terwijl voor anderen het afhankelijk is van de parameters en context (bijvoorbeeld DATEADD).

Context opnieuw instellen

Time intelligence-functies worden uitgevoerd door te beginnen op een bepaald tijdstip en vervolgens een bewerking uit te voeren om een ander tijdstip te verkrijgen. Het beginpunt in de tijd kan natuurlijk conflicteren met dit resultaat, waardoor een filtercontext-snijpunt ontstaat dat standaard gedeeltelijke of lege resultaten oplevert. Neem bijvoorbeeld het volgende scenario.

Agendadefinitie

We hebben een eenvoudige Gregoriaanse kalender die drie categorieën tagt, gedefinieerd als:

Categorie Primaire kolom
Jaar Jaar
Maand van het jaar MaandVanHetJaar
Kwartaal Kwartaal

Definities van metingen

Er worden twee basismetingen gedefinieerd: een om de totale verkoop te berekenen en een andere om de totale verkoop van het vorige kwartaal te berekenen:

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

Voorbeeld: Hoe het wissen van context werkt

Onze tabelvisualisatie doorloopt op maandomvang met behulp van de kolommen Year en MonthOfYear.

Jaar MaandVanHetJaar TotaleVerkoop LastQuarterSales
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

In deze tabel wordt de vetgedrukte rij weergegeven op maandniveau voor de maand april 2011. Daarom worden alle metingen in deze rij geëvalueerd onder de filtercontext van [Jaar] == 2011 en [MonthOfYear] == 4.
Zoals verwacht, wordt TotalSales hier berekend als de totale verkoop voor april 2011.

LastQuarterSales berekent op dezelfde manier TotalSales, maar krijgt een extra filter dat wordt geleverd door de functie op basis van een DATEADD kalender. Voor deze rij DATEADD zou een beginpunt in de tijd van april 2011 zijn en zou het tijdstip opleveren dat precies een kwartaal geleden is: januari 2011. Als gevolg hiervan kan men verwachten dat deze TotalSales wordt berekend onder de volgende twee filtercontexten:

  • Geleverd door de browsekolommen van de huidige rij: { [Year] == 2011, [MonthOfYear] == 4 } (equivalent, april 2011)
  • Geleverd door het DATEADD filter: { [Year] == 2011, [MonthOfYear] == 1 } (equivalent, januari 2011)

Deze twee filtercontexten zouden conflicteren: we kunnen de totale verkoop niet evalueren op basis van de huidige maand, zowel januari 2011 als april 2011. Een dergelijk snijpunt zou geen resultaten opleveren. Dit is echter niet wat er gebeurt. In plaats daarvan bepalen kalendergebaseerde time intelligence-functies op basis van de kalenderdefinitie welke kolommen van categorieën conflicten kunnen veroorzaken tijdens de tijdbewerking die met de functie wordt uitgevoerd. In dit geval voert DATEADD een verschuiving uit op het kwartaalniveau. De functie geeft aan dat zowel de categorieën Jaar als Maand van Jaar kunnen veranderen als gevolg van een wijziging in de kolommen van de categorie Kwartaal . De functie wist dus de filtercontext op alle (zowel primaire als gekoppelde) kolommen die zijn gelabeld als behorend tot deze categorieën.

Met andere woorden, we kunnen zeggen dat de categorieën Jaar en Maand van jaar afhankelijkheden zijn van de categorie Kwartaal . Omgekeerd kunnen we zeggen dat de categorie Kwartaal afhankelijk is van de categorieën Jaar en Maand van jaar .

Hoe het wissen van context werkt

Diagram van de rasterstructuur van alle kalendercategorieën.

Dit diagram wordt gegeven om de afhankelijkheden tussen de verschillende tijdcategorieën beter te visualiseren. Elke categorie in dit rooster vertegenwoordigt alle kolommen (primaire en gekoppelde) die aan die categorie zijn getagd. Categorieën zijn via pijlen verbonden met hun afhankelijkheden. 'Maand' is bijvoorbeeld afhankelijk van 'Jaar', 'Kwartaal van het Jaar', 'Maand van Kwartaal', 'Kwartaal' en 'Maand van het Jaar'.

Wanneer context is ingesteld op een kolom of de bijbehorende sortering op kolom die is gelabeld in een agenda, wordt eerdere filtercontext gewist op:

  1. Alle categorieafhankelijkheden van X. Dit kan worden beschouwd als alle categorieën boven X.
  2. Alle categorieafhankelijkheden van zowel X als de bijbehorende afhankelijkheden (dat wil gezegd, van 1 hierboven). Dit kan worden beschouwd als alle categorieën onder X en alle categorieën in 1 hierboven.

Opmerking

Het wissen van context vindt plaats op kolommen die zijn gemarkeerd in een kalender of geassocieerde sorteerkolommen, ongeacht of de context is ingesteld met time intelligence-functies of anderszins.

De meeste time intelligence-functies, met uitzondering van DATEADD en SAMEPERIODLASTYEAR, wissen de context voor alle tijdgerelateerde kolommen en gekoppelde sorteerkolommen.

Gedrag voor meerdere agenda's

Als er meerdere kalenders zijn gedefinieerd in dezelfde tabel, worden deze processen voltooid voor elke kalender die in de tabel is gedefinieerd. Dit omvat de opmerking over het wissen van context van tijdgerelateerde kolommen. Met andere woorden, stel dat een tabel drie kalenders definieert: Calendar1, Calendar2 en Calendar3. Als filtercontext is ingesteld op categorie X in Agenda1, worden de bovenstaande processen uitgevoerd op alle drie de agenda's.

Voorbeeld: Filter ingesteld op Kwartaal

Als filtercontext werd ingesteld voor de categorie Kwartaal, zou het proces als volgt zijn.

  1. Eerst worden alle afhankelijkheden van de categorie Kwartaal overwogen.

    Voorbeeld van het wissen van filtercontextgedrag, beginnend bij de categorie Kwartaal: Afhankelijkheden.

  2. Vervolgens worden alle afhankelijken van 'Kwartaal' en de bijbehorende afhankelijkheden overwogen.

    Voorbeeld van het wissen van het gedrag van filtercontext vanaf categorie Kwartaal: Afhankelijken.

  3. Ten slotte zou het eindresultaat het volgende zijn. Alle rood gekleurde categorieën zouden hun vorige filtercontext verwijderen en nieuwe context wordt ingesteld op kwartaal.

    Voorbeeld van het wissen van de filtercontext, beginnend bij de categorie Kwartaal: Resultaten

TMDL-script voor agenda's

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

Opmerking

Als u geen categorie voor de calendarColumnGroup TMDL opgeeft, worden de kolommen gelabeld als tijdgerelateerd. In dit voorbeeld zijn vakantienaam en isWorkingDay tijdgerelateerde kolommen in de demokalender.

Alles bijeenbrengen: Voorbeelden van tijdverschuifing

Sommige time intelligence-functies verschuiven de context alleen lateraal, rekening houdend met alle kolommen, terwijl andere hiërarchische verschuivingen uitvoeren, waarbij context wordt behouden of gewist op basis van of kolommen in de agenda worden gelabeld. De time intelligence-functies kunnen worden onderverdeeld in twee groepen op basis van of ze hiërarchische verschuivingen toestaan:

  • Opgelost. Functies in deze groep zijn DATEADD en SAMEPERIODLASTYEAR. Deze functies staan alleen laterale tijdverschuivingen toe en retourneren geen waarden van een ander detailniveau.
  • Flexibel. Deze groep bevat alle andere time intelligence-functies. Deze functies maken hiërarchische tijdverschuivingen mogelijk en afhankelijk van de agenda-instelling kunnen resultaten van een ander detailniveau worden geretourneerd.

Laten we een voorbeeld bekijken met behulp van een eenvoudig gegevensmodel dat bestaat uit twee tabellen, twee kalenders en vijf metingen om dit gedrag weer te geven.

Tabellen en relaties

Voor dit voorbeeld hebben we het volgende eenvoudige gegevensmodel:

Table Columns
Datum Jaar, IsWerkdag, Datum
Verkoop OrderKey, Aantal, Besteldatum

Hier volgen enkele voorbeelden van rijen in de tabel Datum : Schermopname van de eerste 14 rijen van de voorbeeldtabel Datum. De tabel definieert Date, Year en IsWorkingDay. De kolom Date bevat een datum, de kolom Year de jaarwaarde en de kolom IsWorkingDay is een booleaanse kolom (Waar/Onwaar) die aangeeft of de datum een werkdag is of niet.

Hier volgen enkele voorbeeldrijen in de tabel Verkoop : Schermopname van de eerste negen rijen van de tabel Sales. De tabel definieert OrderKey, OrderDate en Order Quantity. De kolom OrderKey bevat een uniek getal voor elke verkooporder, de Orderdatum is een datum die verkoop aan datum heeft gekoppeld en de orderhoeveelheid een numerieke kolom is die het aantal producten voor elke order aangeeft.

De tabellen Sales en Date zijn gerelateerd aan OrderDate en Date.

Schermopname van de modelweergave voor het voorbeeldmodel. Hier ziet u de tabel Verkoop en Datum en een een-op-veel-relatie tussen deze tabellen op Orderdatum en Datum.

Calendars

In de tabel Datum hebben we kalenders gedefinieerd met deze toewijzingen:

KalenderNaam Categorie Primaire kolom
Gregoriaans Jaar Jaar
Datum Datum
GregorianWithWorkingDay Jaar Jaar
Datum Datum
Tijdgerelateerd IsWorkingDay

De equivalente TMDL-definitie van deze twee kalenders is:

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   

Metingen

In de tabel Sales definiëren we de volgende metingen:

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

Voorbeeld van laterale verschuiving

Laten we een visual maken waarin Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity en OneYearAgoQuantityTimeRelated voor 2024 en 2025 worden weergegeven:

Schermopname van een tabelvisual met Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity en OneYearAgoQuantityTimeRelated. De waarden voor OneYearAgoQuantity en OneYearAgoQuantityTimeRelated for 2025 komen overeen met de waarden voor 2024 voor dezelfde IsWorkingDay-waarden.

Alle waarden voor OneYearAgoQuantity en OneYearAgoQuantityTimeRelated for 2025 komen overeen met de totale hoeveelheid van precies één jaar voor (2024), voor dezelfde IsWorkingDay-waarde .

Dit laat zien dat DATEADD de context wordt bijgehouden in een kolom in de tabel Datum die de agenda bevat die wordt gebruikt, ongeacht of deze niet is gelabeld of als deze is gelabeld als tijdgerelateerd in die agenda. Omdat we in onze metingendefinities hebben geïnstrueerd DATEADD om één jaar terug te schuiven, was de enige kolom waarvan de context werd verschoven de kolom die aan de categorie Jaar is gekoppeld. Of de kolom IsWorkingDay in de agenda is gelabeld als tijdgerelateerd of helemaal niet is getagd, heeft het resultaat niet gewijzigd. De enige andere functie die dit gedrag vertoont, is SAMEPERIODLASTYEAR.

Voorbeeld van hiërarchische verschuiving

Laten we nu eens kijken naar een voorbeeld waarin het resultaat inderdaad wordt gewijzigd door een kolom die is gelabeld als tijdgerelateerd of niet.

Hiervoor gaan we dezelfde visual opnieuw maken als in het vorige voorbeeld, maar deze keer gaan we de metingen FullLastYearQuantity en FullLastYearQuantityTimeRelated te gebruiken: Schermopname van een tabelweergave waarin Year, IsWorkingDay, Total Quantity, FullLastYearQuantity en FullLastYearQuantityTimeRelated worden weergegeven. De waarden voor FullLastYearQuantity 2025 komen overeen met de waarden voor 2024 voor dezelfde IsWorkingDay-waarden. De waarden voor FullLastYearQuantityTimeRelated zijn echter gelijk aan de totale hoeveelheid, ongeacht de IsWorkingDay-waarden.

Dit laat zien dat context behouden blijft voor kolommen die PARALLELPERIOD niet in de agenda zijn gelabeld, maar dat de context wordt gewist voor de kolommen die zijn getagd als tijdgerelateerd. FullLastYearQuantity gebruikte de Gregoriaanse kalender waar IsWorkingDay niet in de agenda was gelabeld, terwijl FullLastYearQuantityTime Related de GregorianWithWorkingDay-kalender gebruikte waarbij IsWorkingDay werd gelabeld als tijdgerelateerd. Alle time intelligence-functies behalve DATEADD en SAMEPERIODLASTYEAR gedragen zich op deze manier.

Bonus: Als u deze functies echt wilt forceren om ook context te behouden voor tijdgerelateerde kolommen, kunt u het volgende gebruiken VALUES:

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

In dit geval FullLastYearQuantityTimeRelatedOverride worden dezelfde resultaten geretourneerd als FullLastYearQuantity.

Conclusion

In het uitgebreide voorbeeld hierboven ziet u dat verschillende time intelligence-functies zich anders gedragen, afhankelijk van of kolommen worden gelabeld als tijdgerelateerd in de agenda. DATEADD en SAMEPERIODLASTYEAR alleen laterale tijdsverschuivingen uitvoeren. Alle andere time intelligence-functies maken hiërarchische tijdverschuivingen mogelijk.

Gebruik DATEADD met kalenders

De DATEADD functie heeft specifieke parameters waarmee nauwkeurige controle mogelijk is over de manier waarop verschuivingen worden uitgevoerd wanneer de selectie zich op een gedetailleerder niveau bevindt dan het verschuivingsniveau dat wordt aangegeven door interval de parameter in DATEADD. Dit gebeurt bijvoorbeeld als u gegevens op datumniveau weergeeft, maar de interval parameter DATEADD instelt op MONTH. Als u bijvoorbeeld in een Gregoriaanse kalender een periode tussen 3 en 10 maart per maand verschuift, resulteert dit in 3 tot en met 10 april. Aangezien maanden in Gregoriaanse kalenders echter in lengte variëren, kan dit leiden tot dubbelzinnigheden bij het verschuiven. Hieronder ziet u voorbeeldscenario's op basis van een Gregoriaanse kalender:

Overschakelen van een kortere naar een langere periode

Als u bijvoorbeeld één maand vooruitschuift met een selectie in februari, is de doelmaand maart. U kunt de extension parameter gebruiken om te bepalen hoe de verschuiving wordt uitgevoerd:

Waarde van extensieparameter Description Resultaat
precise Hiermee blijft het oorspronkelijke datumbereik strikt behouden. 25-28 februari wordt verplaatst naar 25-28 maart.
extended Hiermee kan het venster naar het einde van de maand worden uitgebreid. 25-28 februari wordt verplaatst naar 25-31 maart.

Overschakelen van een langere naar een kortere periode

Als u bijvoorbeeld één maand achteruit schuift met een selectie in maart, is de doelmaand februari.

U kunt de truncation parameter gebruiken om te bepalen hoe de verschuiving wordt uitgevoerd:

Parameterwaarde voor truncatie Description Resultaat
anchored Hiermee wordt het resultaat verankerd aan de laatste geldige datum van de kleinere maand. 31 maart wordt verplaatst naar 28 februari (of 29 in schrikkeljaar).
blank Als er geen verplaatste datum bestaat, retourneer dan leeg. Het terugschuiven van 31 maart met één maand keert leeg terug (omdat 31 februari niet bestaat).

Overwegingen voor het werken met time intelligence op basis van agenda's

  • Het uitvoeren van een time intelligence-berekening op een feitentabel die een kalender definieert en onderhevig is aan regels voor beveiliging op rijniveau (RLS), kan leiden tot onverwachte resultaten.
  • De prestaties van deze preview-functie zijn niet representatief voor het eindproduct.
  • U kunt nog geen agenda's maken in de Power BI-service.
  • Gebruik geen automatische datum-/tijdtabellen met aangepaste agenda's.
  • U kunt geen agenda's gebruiken met live verbonden of samengestelde modellen.
  • U wordt aangeraden alleen de kolommen in uw agenda te koppelen die u wilt gebruiken in time intelligence-berekeningen.
  • Agenda's zijn onderhevig aan zowel realtime-validaties als offlinevalidaties. U kunt uw agenda opslaan ondanks offlinevalidatiefouten, maar het wordt aanbevolen deze eerst op te lossen. Validatiefouten in realtime moeten worden hersteld om te kunnen opslaan.
  • Elke agenda moet een unieke naam hebben binnen het gegevensmodel
  • Eén tabel kan meerdere agenda's bevatten
  • De tabel met de agenda moet minder dan 200 kolommen bevatten. Als de tabel meer dan 20.000 rijen bevat, zijn de validaties niet beschikbaar, maar kunt u nog steeds een agenda toevoegen.
  • Een agenda moet ten minste één primaire kolom toewijzen aan een categorie
  • Een agenda kan alleen kolommen uit een eigen tabel toewijzen aan categorieën
  • Aan elke categorie moet een primaire kolom zijn toegewezen en er kunnen nul of meer gekoppelde kolommen zijn toegewezen
  • DATEADD bevat nieuwe parameters voor het beheren van extensie- en extensiegedrag, die niet worden herkend in IntelliSense.
  • Elke kolom kan worden toegewezen aan slechts één categorie
  • U kunt geen tijdintelligentie-functies nesten die gebruikmaken van agenda's. De volgende DAX-instructie wordt bijvoorbeeld niet ondersteund:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

In plaats daarvan kunt u het volgende doen:

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

Een datumtabel maken met ingebouwde hulpprogramma's

In de volgende voorbeelden wordt een datumtabel gemaakt van 1 januari 2010 tot en met 31 december 2030 met Power Query M of DAX. Het bevat de volgende kolommen: Jaar, Maandnummer, Maandnaam, Maandjaar, Kwartaal, Jaar Kwartaal, Dag en Datum.

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

Zie Datumtabellen voor meer informatie en meer opties.

Zie de volgende bronnen voor meer informatie over dit artikel: