Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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:
- Power Query M. U kunt de functie List.Dates gebruiken. Verderop in dit document wordt een voorbeeld gegeven.
- DAX. U kunt de functies CALENDAR of CALENDARAUTO gebruiken om een eenvoudige berekende datumtabel te genereren. U kunt ook een geavanceerdere DAX-instructie gebruiken om een datumtabel te maken. Verderop in dit document wordt een voorbeeld gegeven.
- Externe hulpprogramma's.
- Laden vanuit een bron, zoals een bronsysteem, een bestand of een ander semantisch Power BI-model.
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.
- Ga in Power BI Desktop naar Bestand > Opties en instellingen > Opties > Previewfuncties.
- Selecteer de preview-versie van Enhanced DAX Time Intelligence .
- Selecteer OK
- 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:
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:
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
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.
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:
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.
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:
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.
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:
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
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:
- Alle categorieafhankelijkheden van X. Dit kan worden beschouwd als alle categorieën boven X.
- 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.
Tijdgerelateerde kolommen
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.
Eerst worden alle afhankelijkheden van de categorie Kwartaal overwogen.
Vervolgens worden alle afhankelijken van 'Kwartaal' en de bijbehorende afhankelijkheden overwogen.
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.
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 :
Hier volgen enkele voorbeeldrijen in de tabel Verkoop :
De tabellen Sales en Date zijn gerelateerd aan OrderDate en Date.
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:
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:
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.
Verwante inhoud
Zie de volgende bronnen voor meer informatie over dit artikel: