Del via


Implementer tidsbaserede beregninger i Power BI

Power BI tilbyder flere værktøjer til at udføre tidsbaserede beregninger, som enten er afhængige af automatiske datotabeller eller datotabeller, du tilføjer.

Vi anbefaler, at du bruger kalenderbaseret tidsintelligens (forhåndsversion), fordi det giver den bedste ydeevne og den højeste fleksibilitet til at opfylde enhver kalender.

Denne tabel sammenligner de tre værktøjer, der er til rådighed:

Værktøjet Opsætningsindsats påkrævet Nem administration Fleksibilitet Bemærkninger
Automatisk dato/klokkeslæt Stort set nul hård lav Øger modelstørrelsen på grund af flere skjulte datotabeller, der er oprettet
Klassisk tidsintelligens medie let lav Kræver oprettelse af en datotabel, antager gregoriansk eller skiftet gregoriansk kalender, lider af ydeevneproblemer i nogle specifikke scenarier
Kalenderbaseret tidsintelligens høj medie høj Anbefales at oprette en datotabel, højeste fleksibilitet, bedste ydeevne, men øgede opsætningsomkostninger

Notat

Vi fraråder at bruge alternative tidsintelligensteknikker, især dem, der involverer tilføjelse af ekstra kolonner til datotabeller for at beregne forskydninger, undtagen for specifikke brugstilfælde. Selvom disse tilgange kan appellere til begyndere på grund af deres enkle DAX-formler, har de en tendens til at puste semantiske modeller unødigt op. Denne oppustethed kan føre til langsommere dataopdateringer og forringet rapportydeevne, efterhånden som datasættene vokser.

Automatisk dato/klokkeslæt

Funktionen til automatisk dato/klokkeslæt opretter automatisk skjulte datotabeller for hvert datofelt i din datamodel. Du kan finde flere oplysninger om denne automatiske funktionsmåde under Anvend automatisk dato/klokkeslæt i Power BI Desktop.

Notat

Selvom automatisk dato/klokkeslæt er en praktisk mulighed for simple modeller, anbefales det ikke til mere komplekse scenarier og større modeller. Til disse modeller er det at foretrække at oprette et dedikeret bord for mere fleksibilitet.

Tilføje en datotabel

For de fleste modeller anbefales det at tilføje en datotabel (eller flere i nogle scenarier). Mange dataanalytikere foretrækker at oprette deres egne datotabeller, hvilket er fint.

Der er flere måder at oprette en sådan tabel på, herunder:

Hvilken mulighed der er bedst for dig afhænger af forskellige faktorer og ligger uden for rammerne af denne vejledning.

Arbejde med tidsbaserede beregninger

Hvis du antager, at du ikke bruger automatisk dato/klokkeslæt, er der to alternative måder at arbejde med tidsintelligensfunktioner i Power BI til at udføre tidsbaserede beregninger:

  • Klassisk tidsintelligens. Den nemmeste mulighed og fungerer godt for gregorianske eller skiftende gregorianske kalendere, men har begrænset fleksibilitet for kalendere, der er struktureret anderledes eller til ugebaserede beregninger.
  • Kalenderbaseret tidsintelligens (forhåndsversion). Nyere mulighed, men kræver lidt mere arbejde at konfigurere. Det giver dig dog også bedre ydeevne, mere fleksibilitet til at arbejde med ikke-gregorianske kalendere og mulighed for at udføre ugebaserede beregninger.

Notat

Du skal angive din tabel som en datotabel for bestemte scenarier.

Klassisk tidsintelligens

Denne indstilling kræver, at du har en datotabel i din model og indstiller den i overensstemmelse hermed. Bagefter kan du bruge tidsintelligensfunktionerne og henvise til din datotabel. Hvis du f.eks. har en datotabel med navnet Dato i din model, som du angiver som din datotabel, som indeholder en datokolonne, kan du bruge:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Selvom dette er en hurtig og nem tilgang, er der mange ulemper i forhold til den kalenderbaserede tilgang:

  • Det kræver, at du indstiller datotabellen
  • Det fungerer kun med modeller, der har mindst én dedikeret datotabel
  • De anvendte datokolonner må ikke have manglende datoer mellem den første og sidste dato. Hvis der mangler datoer mellem den første og sidste dato, opstår der en fejl.
  • den er mindre fleksibel, da den er optimeret til gregorianske eller skiftende gregorianske kalendere, såsom regnskabsår, der starter den 1. juli, men stadig følger en gregoriansk kalender
  • Den giver ikke ugebaserede beregninger
  • I specifikke scenarier fungerer tidsbaserede beregninger ikke godt.

Notat

Vi anbefaler, at du bruger den forbedrede, kalenderbaserede tilgang.

Kalenderbaseret tidsintelligens (prøveversion)

Kalendere er metadatadefinitioner, der føjes til en tabel for at angive, hvilke kolonner fra den tabel, der repræsenterer hvilke tidsattributter. Du kan definere en eller flere kalendere i en hvilken som helst tabel i din model. Når du har defineret kalenderen i din model, kan du referere til den i dine tidsintelligensfunktioner. Sådan beregnes f.eks. et samlet år til dato for salg ved hjælp af en defineret regnskabskalender:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Fordele ved kalenderbaseret tidsintelligens

De vigtigste fordele ved kalenderbaseret tidsintelligens er:

Fungerer med enhver kalender

Kalendere giver dig fuld fleksibilitet til at beslutte, hvordan du vil opdele tiden i år, kvartaler, måneder og uger. Du kan f.eks. definere de kalendere, der følger disse mønstre:

  • Gregoriansk
  • Skiftet gregoriansk
  • Detailhandel (445, 454, 544 mønstre)
  • 13-måneders
  • Månens

Mulighederne er uendelige, da der ikke er nogen indbygget antagelse fra Power BI om, hvordan din kalender er struktureret. Kalenderbaseret tidsintelligens gør ingen antagelser om de underliggende datoer. Alle beregninger bruger de underliggende data nøjagtigt as-is.

Sparsomme datoer

Klassisk tidsintelligens kræver, at den angivne datokolonne er komplet – hvis der mangler datoer mellem den første og sidste dato, opstår der en fejl. Kalenderbaserede tidsintelligensfunktioner har ikke et sådant krav. I stedet opererer de på datoerne as-is. Selvom vi stadig anbefaler at have en komplet og dedikeret kalendertabel, behøver du ikke længere at have den. Hvis alle dine detailbutikker f.eks. er lukket i weekenden, kan du springe weekenddagene over, da de ikke har noget udsalg. Hvis du antager, at din weekend er lørdag og søndag, kan du nu bruge PREVIOUSDAY en kalender baseret på en tabel, der ikke har poster for weekenden, til at springe fra mandag lige til fredag.

Ugebaserede beregninger

Kalenderbaseret tidsintelligens leverer DAX-funktioner direkte, der fungerer med en uges granularitet. For eksempel kan totaler fra uge til dato beregnes direkte ved hjælp af TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Forbedringer af ydeevnen

Nogle scenarier kan udvise forbedret ydeevne, når man sammenligner en kalenderbaseret tidsintelligensfunktion med dens klassiske modstykke. En visualisering, der er grupperet efter uge og udfører en år-til-dato-beregning ved hjælp af TOTALYTD ( ..., CalendarName ) , skal f.eks. generelt udføres hurtigere, end hvis den klassiske modstykke, TOTALYTD ( ..., TableName[DateColumnName] ), blev brugt. Du kan få indsigt i, hvorfor dette kan ske, i afsnittet Kontekstrydning .

Aktivér den forbedrede DAX Time Intelligence-prøveversion

For at komme i gang skal du først aktivere funktionen Udvidet DAX Time Intelligence-prøveversion .

  1. I Power BI Desktop skal du gå til Filindstillinger > og indstillinger > Indstillinger > Eksempelfunktioner.
  2. Vælg Enhanced DAX Time Intelligence-prøveversionen.
  3. Vælg OK
  4. Genstart Power BI Desktop

Administrere kalendere

Hvis du vil administrere en kalender, skal du højreklikke på den tabel, der indeholder kalenderen, eller som du vil definere kalenderen på, og vælge Kalenderindstillinger eller vælge Kalenderindstillinger på båndet Tabelværktøjer, når du har valgt tabellen:

Skærmbillede, der viser indgangspunkterne for at åbne kalenderindstillingerne på en tabel.

Alternativt kan du bruge eksterne værktøjer eller TMDL-visningen til at definere en kalender. Du kan finde flere oplysninger i TMDL-scriptet.

Kalendere vises også i modeloversigten under den tabel, hvor de er defineret:

Skærmbillede, der viser modeloversigten for en semantisk model. Noden Datotabel udvides, og kalenderne fremhæves.

Skærmbilledet med kalenderindstillinger

Skærmbilledet med kalenderindstillinger viser de kalendere, der er defineret i den valgte tabel. Her kan du:

  • oprette en ny kalender ved at vælge Ny kalender
  • Rediger en eksisterende kalender ved at vælge Rediger
  • Slet en eksisterende kalender ved at vælge Slet
  • angive tabellen som en datotabel ved at vælge Markér som datotabel

Skærmbillede, der viser kalenderindstillingerne på en tabel.

Tildele kolonnekategorier

At definere en kalender indebærer at give den et navn og tildele kolonner til kategorier. Hver kategori repræsenterer en tidsenhed, og specifikke kolonnekategorier er tilgængelige. Du skal som minimum tildele én primær kolonne til en kategori for at gemme din kalender. Hver kategori skal have en primær kolonne og kan have nul eller flere tilknyttede kolonner. Når kolonner, der er knyttet til en kategori, er i kontekst, ved Power BI, hvilken tidsenhed de præsenterer. For nogle funktioner, f.eks TOTALMTD . Power BI, bruger den primære kolonne, der er knyttet til den relevante kategori i den kalender, der refereres til, til at udføre den ønskede beregning. Hvis du vil tildele en kolonne til en kategori, skal du vælge kategorien i menuen Tilføj kategori og derefter vælge de primære og valgfrie tilknyttede kolonner.

Skærmbillede, der viser skærmen til oprettelse og redigering af kalenderen.

Tilgængelige kolonnekategorier

I følgende tabel vises de kategorier, der er tilgængelige. Tabellen giver også eksempelværdier og kardinaliteter for gregorianske kalendere.

Kategorierne er opdelt i to grupper:

  • Komplet. Data i kolonner, der er tildelt Fuldførte kategorier, er nok til entydigt at identificere tidsperioden.
  • Delvist. Data i kolonner, der er tildelt delvise kategorier, er ikke nok til entydigt at identificere tidsperioden.
Kategori Beskrivelse Type Eksempel på kardinalitet i en gregoriansk kalender Eksempel på kolonneværdier i en gregoriansk kalender
Year Året Complete Y = antal år 2024, 2025
Kvartal Kvartalet inkl. året Complete 4*Y 1. kvartal 2024, 2. kvartal 2025
Kvartal af året Årets kvartal Partial 4 År 1. kvartal, 1. kvartal, 1. kvartal, 2. kvartal
Month Måneden inklusive året Complete 12*Y ≤ value ≤ 13*Y januar 2023, 2024 feb
Måned i år Måneden i året Partial 12 Januar, År Måned 11, YM11, M11, 11
Måned i kvartalet Måneden i kvartalet Partial 3 1, QM2
Week Ugen inklusive året Complete 52 ≤ value ≤ 53 Uge 50 2023, W50-2023, 2023-W50
Årets uge Årets uge Partial 52 Uge 50, V50, 50
Uge i kvartalet Ugen i kvartalet Partial 13 Kvartal Uge 10, QW10, 10
Uge i måned Ugen i måneden Partial 5 Måned Uge 2, MW2, 2
Dato Datoen Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
Dag i året Årets dag Partial 365 ≤ value ≤366 365, D1
Kvartalets dag Dagen i kvartalet Partial 92 Kvartal dag 10, QD2, 50
Dag i måneden Dagen i måneden Partial 31 Måned Dag 30, MD10, 30
Ugedag Ugedagen Partial 7 Ugedag 5, WD5, 5

Ud over disse kategorier kan du knytte et vilkårligt antal kolonner i tabellen til kategorien Tidsrelateret . Dette er i øjeblikket ikke muligt i kalenderindstillingerne, men kan i stedet kun gøres ved hjælp af eksterne værktøjer eller TMDL.

Notat

Kontekst for alle kolonner, der er tildelt den tidsrelaterede kategori, fjernes, når der udføres beregninger i alle funktioner undtagen DATEADD og SAMEPERIODLASTYEAR. Al kontekst for kolonner, der er en del af den tabel, som kalenderen er defineret på, men som ikke er mærket i den pågældende kalender, bevares.

Notat

Det anbefales, at du kun tilknytter de kolonner i kalenderen, som du vil bruge i tidsintelligensberegninger.

Primære versus tilknyttede kolonner

Den primære kolonne er påkrævet for hver kategori. Når denne kolonne eller eventuelle tilknyttede kolonner, der er tildelt den samme kategori i den kalender, der refereres til, er i kontekst, eller kategorien er påkrævet for at udføre en beregning, bruger Power BI den primære kolonne. Derudover bruges de primære kolonner til sortering. Hvis værdierne i den primære kolonne ikke tillader, at den kan sorteres som forventet, kan du enten konfigurere den primære kolonne til at sortere efter en anden kolonne eller bruge en anden kolonne og gøre den oprindelige kolonne til en tilknyttet kolonne. En kolonne med tekstdata, der indeholder månedsnummer og år i formatet (dvs. , , osv.), sorteres f.eks. ikke korrekt på tværs af mm-yyyy flere år, men en kolonne, der bruger formatet01-2024, vil: 02-2024yyyy-mm

Skærmbillede, der viser to tabeller. Hver tabel har én kolonne. Den første tabel indeholder en kolonne, der indeholder oplysninger om månedstal og år i formatet mm-åååå, og den anden indeholder de samme oplysninger i formatet åååå-mm. Kolonnen, der indeholder dataene i formatet mm-åååå, er ikke sorteret korrekt.

Du kan have nul eller flere tilknyttede kolonner tildelt en kategori.

Validation

Det er vigtigt at validere og teste din kalender, så du er sikker på, at den opfylder dine behov. De valideringer, der tilbydes i Power BI, omfatter både valideringer i realtid og offlinevalideringer.

Notat

Du kan gemme din kalender på trods af offlinevalideringsfejl, men det anbefales at løse dem først. Valideringsfejl i realtid skal rettes for at gemme.

Valideringer i realtid

De realtidsvalideringer, der udføres på kalenderne, er:

  • Entydigt kalendernavn. Hver kalender skal have et entydigt navn i den semantiske model.
  • Enkelt forening pr. kalender. En kolonne kan ikke tilhøre mere end én kategori i den samme kalender.
  • Periodens unikhed. Tildelte kategorier skal entydigt identificere perioden.
  • Konsekvent kategorisering. Dette sikrer, at kolonner er knyttet til den samme kategori på tværs af kalendere.

Periodens unikke karakter

Der skal altid være en sti til entydigt at identificere perioden for de tildelte kategorier.

Når du tilføjer en delvis kategori, validerer Power BI, at en matchende kombination af komplette eller delvise kategorier også er mærket i den samme kalender. Hvis det ikke er tilfældet, vises en advarsel.

Skærmbillede, der viser skærmen til oprettelse og redigering af kalenderen med en valideringsfejl i realtid.

Når du f.eks. konfigurerer en kalender til ugebaserede beregninger, skal du sørge for at tildele mindst en primær kolonne til et af følgende sæt kategorier:

  • Week
  • Uge i år, år
  • Uge i kvartal, kvartal
  • Uge i kvartalet, kvartal i året, år
  • Uge i Måned, Måned
  • Uge i Måned, Måned i År, År
  • Uge i måneden, måned i kvartal, kvartal
  • Uge i måneden, måned i kvartalet, kvartal i året, år

Konsekvent kategorisering

Kolonner skal have en ensartet kategori på tværs af kalendere. Du kan ikke tildele den samme kolonne til forskellige kategorier som År, Kvartal eller tidsrelateret i separate kalendere.

Offline valideringer

Offlinevalideringer kan potentielt være tidskrævende, da de får adgang til tabeldata. Derfor kører de ikke automatisk i modsætning til valideringerne i realtid. Hvis du vil køre valideringerne, skal du vælge Valider data:

Skærmbillede, der viser skærmen til oprettelse og redigering af kalenderen. Knappen Valider data er fremhævet.

Offlinevalideringerne kontrollerer følgende regler og returnerer en advarsel, hvis nogen regler er ugyldige i din kalender:

  • En kolonne, der er knyttet til en kategori, har ikke tomme værdier.
  • Kategorier på højere niveau og lavere niveau har et en-til-mange-kardinalitetsforhold. Kolonner, der er knyttet til kategorien År, skal f.eks. have en en-til-mange-kardinalitet med kolonner, der er knyttet til kategorien Måned.
  • Kolonner, der er knyttet til kategorier på samme niveau, har et en-til-en-kardinalitetsforhold. Kolonner, der er knyttet til kategorien Måned, skal f.eks. have en en-til-en-kardinalitet med kombinationerne af de kolonner, der er knyttet til kategorierne Måned i År og År.
  • primære og tilknyttede kolonner, der er tildelt den samme kategori, har et en-til-en-kardinalitetsforhold. Når den f.eks. tildeles kategorien Måned, skal den primære kolonne Måned og en tilknyttet kolonne EnglishMonthName have en en-til-en-kardinalitet.

Arbejde med kalendere

Når en kalender er defineret, kan du henvise til den i Tidsintelligensfunktioner. Følgende måling beregner f.eks. en samlet værdi fra måned til dato for Samlet antal i forhold til ISO-454-kalenderen :

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

Hvis kalenderen ikke er defineret, og fejlen returneres:

Skærmbillede, der viser en måling ved hjælp af TOTALMTD funktionen med en kalenderparameter til en ikke-eksisterende kalender.

Selvom kalenderen er defineret, kan en måling dog stadig returnere en fejl. Dette sker, hvis den anvendte funktion forventer, at der er en kategori til stede i kalenderen, og kalenderen ikke har denne kategori. Forventer f.eks., TOTALWTD at bestemte kategorier er til stede i kalenderen. Hvis de ikke er det, returneres der en fejl:

Skærmbillede, der viser en måling ved hjælp af TOTALWTD funktionen med en gyldig kalenderreference, der ikke definerer de påkrævede kategorier.

Tidsintelligensfunktioner og påkrævede kategorier

Mange tidsintelligensfunktioner kræver, at der medtages tilstrækkelige kategorier i den kalender, der refereres til i funktionskaldet, så Power BI kan identificere en bestemt tidsenhed. Power BI skal med andre ord kunne "walk-up" fra det niveau, kalkulationen udføres på, helt frem til et enkelt år. Det kan f.eks. være, når du udfører en beregning på kvartaler, f.eks. ved hjælp af TOTALQTD enten at tildele kategorien Kvartal eller tildele både Kvartal ogÅr i kalenderen som dikteret af valideringen Entydighed af periode .

Notat

For nogle funktioner er deres navn vejledende for, hvilket niveau beregningen fungerer (f.eks. TOTALYTD), mens det for andre er afhængigt af parametrene og konteksten (f.eks DATEADD. ).

Kontekst rydning

Tidsintelligensfunktioner fungerer ved at starte på et tidspunkt og derefter udføre en operation på det for at give et andet tidspunkt. Naturligvis kan det indledende tidspunkt være i konflikt med dette resultat, hvilket forårsager et filterkontekstskæringspunkt, der som standard ville give delvise eller tomme resultater. Overvej f.eks. følgende scenario.

Definition af kalender

Vi har en simpel gregoriansk kalender, der mærker tre kategorier, defineret som:

Kategori Primær kolonne
Year Year
Måned i år MånedÅr
Kvartal Kvartal

Definitioner af målinger

Der er defineret to grundlæggende målinger: en til beregning af det samlede salg og en anden til beregning af det samlede salg fra det foregående kvartal:

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

Eksempel: Sådan fungerer kontekstrydning

Vores tabelvisualisering gennemser med en månedsgranularitet ved hjælp af kolonnerne Year og MonthOfYear :

Year MånedÅr Samletsalg Sidste kvartalSalg
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

I denne tabel gennemser rækken med fed skrift på månedsniveau for april måned 2011. Derfor evalueres alle målinger i denne række under filterkonteksten [Year] == 2011 og [MonthOfYear] == 4.
Som forventet er TotalSales her beregnet som det samlede salg for april 2011.

LastQuarterSales beregner på samme måde TotalSales, men får et ekstra filter, der leveres af den DATEADD kalenderbaserede funktion. For denne række DATEADD ville have et indledende starttidspunkt i april 2011 og ville give det tidspunkt, der er præcis et kvartal siden: januar 2011. Som følge heraf kan man forvente, at denne TotalSales beregnes under følgende to filterkontekster:

  • Leveres af den aktuelle rækkes browserkolonner: { [Year] == 2011, [MonthOfYear] == 4 } (Tilsvarende april 2011)
  • Leveret af filteret DATEADD : { [Year] == 2011, [MonthOfYear] == 1 } (Tilsvarende januar 2011)

Det er klart, at disse to filterkontekster ville være i konflikt - vi kan ikke evaluere det samlede salg givet den aktuelle måned som både januar 2011 og april 2011. Et sådant kryds ville ikke give nogen resultater. Det er dog ikke, hvad der sker. I stedet identificerer kalenderbaserede tidsintelligensfunktioner baseret på kalenderdefinitionen, hvilke kategoriers kolonner der kan resultere i konflikter, efter den tidshandling, som funktionen udfører. I dette tilfælde DATEADD udføres et skift på kvartalsniveau . Funktionen identificerer, at både kategorierne År og Måned i År kan ændres som følge af en ændring i kolonnerne i kategorien Kvartal . Funktionen rydder således filterkonteksten for alle (både primære og tilknyttede) kolonner, der er mærket til disse kategorier.

Med andre ord kan vi sige, at kategorierne År og Måned i År er afhængigheder af kategorien Kvartal . Omvendt kan vi sige, at kategorien Kvartal er afhængig af kategorierne År og Måned i År .

Sådan fungerer kontekstrydning

Gitterstrukturdiagram over alle kalenderkategorier.

Dette diagram er angivet for bedre at visualisere afhængighederne mellem de forskellige tidskategorier. Hver kategori i dette gitter repræsenterer alle kolonner (primære og tilknyttede), der er mærket til den pågældende kategori. Kategorier er forbundet med deres afhængigheder via pile. "Måned" er f.eks. afhængig af "År", "Kvartalskvartal", "Kvartalsmåned", "Kvartal" og "Årsmåned".

Når konteksten er angivet for en kolonne eller den tilknyttede sortering efter kolonne , der er mærket i en kalender, ryddes den tidligere filterkontekst for:

  1. Alle kategoriafhængigheder af X. Dette kan betragtes som alle kategorier over X.
  2. Alle kategoriafhængige af både X og dets afhængigheder (det vil sige fra 1. ovenfor). Dette kan betragtes som alle kategorier under X og alle kategorier i 1 ovenfor.

Notat

Rydning af kontekst sker på kolonner, der er mærket i en kalender eller tilknyttede sorteringskolonner, uanset om konteksten er angivet ved hjælp af tidsintelligensfunktioner eller på anden måde.

De fleste tidsintelligensfunktioner, undtagen og DATEADDSAMEPERIODLASTYEAR, rydder konteksten for alle tidsrelaterede kolonner og tilknyttede sorteringskolonner.

Funktionsmåde på tværs af kalendere

Hvis der er defineret flere kalendere i den samme tabel, fuldføres disse processer for hver kalender, der er defineret i tabellen. Dette inkluderer bemærkningen om kontekstrydning af tidsrelaterede kolonner. Med andre ord skal du antage, at en tabel definerer tre kalendere: Kalender1, Kalender2 og Kalender3. Hvis filterkonteksten er indstillet på kategori "X" i Kalender1, udføres ovenstående processer på alle tre kalendere.

Eksempel: Filter indstillet på "Kvartal"

Hvis filterkonteksten blev indstillet på kategorien "Kvartal", ville processen være som følger.

  1. For det første vil alle afhængigheder af kategorien "Kvartal" blive taget i betragtning.

    Eksempel på funktionsmåde for rydning af filterkontekst startende fra kategorien Kvartal: Afhængigheder.

  2. Dernæst vil alle afhængige af "Quarter" og dets afhængigheder blive taget i betragtning.

    Eksempel på funktionsmåden for rydning af filterkontekst startende fra kategorien Kvartal: Afhængige.

  3. Endelig ville slutresultatet være følgende. Alle rødfarvede kategorier vil få deres tidligere filterkontekst fjernet, og ny kontekst er sat til Kvartal.

    Eksempel på funktionsmåd for rydning af filterkontekst startende fra kategori Kvartal: Resultater

TMDL-script til kalendere

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

Notat

Bemærk, at hvis du ikke angiver nogen kategori for calendarColumnGroup i TMDL, mærkes kolonnerne som tidsrelaterede. I dette eksempel er Ferienavn og isWorkingDay tidsrelaterede kolonner i demokalenderen.

Sæt det hele sammen: Eksempler på tidsforskydning

Nogle tidsintelligensfunktioner skifter kun kontekst sideværts under hensyntagen til alle kolonner, mens andre udfører hierarkiske skift – bevarer eller rydder kontekst baseret på, om kolonner er mærket i kalenderen. Tidsintelligensfunktionerne kan opdeles i to grupper baseret på, om de tillader hierarkiske skift:

  • Rettet. Funktioner i denne gruppe er DATEADD og SAMEPERIODLASTYEAR. Disse funktioner tillader kun laterale tidsforskydninger og returnerer ikke værdier fra et andet detaljeringsniveau.
  • Fleksibel. Denne gruppe indeholder alle andre tidsintelligensfunktioner. Disse funktioner tillader hierarkiske tidsforskydninger og kan afhængigt af kalenderopsætningen returnere resultater fra et andet detaljeringsniveau.

For at vise disse funktionsmåder skal vi gennemgå et eksempel ved hjælp af en simpel datamodel, der består af to tabeller, to kalendere og fem målinger.

Tabeller og relationer

I dette eksempel har vi følgende enkle datamodel:

Table Columns
Dato År, IsWorkingDay, Dato
Sales Ordrenøgle, antal, ordredato

Her er nogle eksempler på rækker i tabellen Dato : Skærmbillede, der viser de første 14 rækker i eksempeltabellen Dato. Tabellen definerer dato, år og IsWorkingDay. Kolonnen Dato indeholder en dato, kolonnen År værdien år, og kolonnen IsWorkingDay er en boolesk kolonne (sand/falsk), der angiver, om datoen er en arbejdsdag eller ej.

Her er nogle eksempelrækker i tabellen Salg : Skærmbillede, der viser de første ni rækker i eksempeltabellen Salg. Tabellen definerer Ordrenøgle, Ordredato og Ordreantal. Kolonnen Ordrenøgle indeholder et entydigt nummer for hver salgsordre, Ordredato er en dato, der relaterer Salg til dato, og Ordreantal er en numerisk kolonne, der repræsenterer antallet af produkter for hver ordre.

Tabellerne Salg og Dato er relateret til Ordredato og Dato.

Skærmbillede, der viser modelvisningen for eksempelmodellen. Den viser tabellen Salg og Dato og en en-til-mange-relation mellem dem på Ordredato og Dato.

Kalendere

I tabellen Dato har vi defineret kalendere med disse tilknytninger:

Kalender Navn Kategori Primær kolonne
Gregoriansk Year Year
Dato Dato
GregorianWithWorkingDay Year Year
Dato Dato
Tidsrelateret IsWorkingDay

Den tilsvarende TMDL-definition af disse to kalendere er:

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   

Målinger

I tabellen Salg definerer vi følgende målinger:

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

Eksempel på sideforskydning

Lad os oprette en visualisering, der viser Year, MonthOfYear, IsWorkingDay, Total quantity, OneYearAgoQuantity og OneYearAgoQuantityTimeRelated for 2024 og 2025:

Skærmbillede, der viser en tabelvisualisering, der viser Year, IsWorkingDay, Total quantity, OneYearAgoQuantity og OneYearAgoQuantityTimeRelated. Værdierne for OneYearAgoQuantity og OneYearAgoQuantityTimeRelated for 2025 svarer til værdierne for 2024 for de samme IsWorkingDay-værdier.

Alle værdier for OneYearAgoQuantity og OneYearAgoQuantityTimeRelated for 2025 svarer til Total Quantity fra præcis et år før (2024) for den samme IsWorkingDay-værdi .

Dette viser, at DATEADD konteksten bevares for alle kolonner i tabellen Dato, der indeholder den anvendte kalender, uanset om den ikke er kodet, eller om den er mærket som tidsrelateret i den pågældende kalender. Da vi i vores målingsdefinitioner instruerede DATEADD i at skifte tilbage med et år, var den eneste kolonne, hvis kontekst blev ændret, den kolonne, der er knyttet til kategorien År. Om kolonnen IsWorkingDay var mærket i kalenderen som tidsrelateret eller slet ikke mærket, ændrede ikke resultatet. Den eneste anden funktion, der udviser denne adfærd, er SAMEPERIODLASTYEAR.

Eksempel på hierarkisk skift

Lad os nu se på et eksempel, hvor det faktisk ændrer resultatet, om en kolonne er mærket som tidsrelateret eller ej.

Til dette formål skal vi genskabe den samme visualisering som i det forrige eksempel, men denne gang skal vi bruge målingerne FullLastYearQuantity og FullLastYearQuantityTimeRelatered: Skærmbillede, der viser en tabelvisualisering, der viser Year, IsWorkingDay, Total quantity, FullLastYearQuantity og FullLastYearQuantityTimeRelated. Værdierne for FullLastYearQuantity 2025 svarer til værdierne for 2024 for de samme IsWorkingDay-værdier, men værdierne for FullLastYearQuantityTimeRelated er lig med den samlede antalsværdi uanset IsWorkingDay-værdierne.

Dette viser, at konteksten bevares for kolonner, der ikke er mærket i kalenderen, men rydder konteksten for dem, der PARALLELPERIOD er mærket som tidsrelaterede. FullLastYearQuantity brugte den gregorianske kalender, hvor IsWorkingDay ikke var tagget i kalenderen, mens FullLastYearQuantityTimeRelated brugte GregorianWithWorkingDay-kalenderen , hvor IsWorkingDay var mærket som tidsrelateret. Alle tidsintelligensfunktioner undtagen DATEADD og SAMEPERIODLASTYEAR opfører sig på denne måde.

Bonus: Hvis du virkelig ønsker at tvinge disse funktioner til også at bevare konteksten for tidsrelaterede kolonner, kan du bruge VALUES:

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

I dette tilfælde FullLastYearQuantityTimeRelatedOverride returneres de samme resultater som FullLastYearQuantity.

Konklusion

Det udførlige eksempel ovenfor viser, at forskellige tidsintelligensfunktioner opfører sig forskelligt, afhængigt af om kolonner er mærket som tidsrelaterede i kalenderen. DATEADD og SAMEPERIODLASTYEAR kun udføre laterale tidsforskydninger. Alle andre tidsintelligensfunktioner tillader hierarkiske tidsforskydninger.

Brug DATEADD med kalendere

Funktionen DATEADD har specifikke parametre, der giver mulighed for finkornet kontrol over, hvordan skift udføres, når markeringen er på et mere detaljeret niveau end det skiftniveau, der er angivet med interval parameteren i DATEADD. Dette sker f.eks., hvis du viser data på datoniveau, men angiver parameteren interval til DATEADDMÅNED. For eksempel, i en gregoriansk kalender, når du flytter en periode, der strækker sig fra 3. til 10. marts med en måned, vil resultere i 3. til 10. april. Men da måneder i gregorianske kalendere varierer i længde, kan dette føre til tvetydigheder, når de skifter. Nedenfor er eksempler på scenarier baseret på en gregoriansk kalender:

Skift fra en kortere til en længere periode

Du kan f.eks. skifte en måned frem med en markering i februar, så målmåneden er marts. Du kan bruge parameteren extension til at påvirke, hvordan skiftet udføres:

Værdi for udvidelsesparameter Beskrivelse Resultat
precise Dette holder det oprindelige datointerval strengt. 25.-28. februar er flyttet til 25.-28. marts.
extended Tillader, at vinduet udvides mod slutningen af måneden. 25.-28. februar er flyttet til 25.-31. marts.

Skift fra en længere til en kortere periode

Du kan f.eks. skifte en måned tilbage med en markering i marts, så målmåneden er februar.

Du kan bruge parameteren truncation til at påvirke, hvordan skiftet udføres:

Værdi for afkortningsparameter Beskrivelse Resultat
anchored Forankrer resultatet til den sidste gyldige dato i den mindre måned. 31. marts flyttes til 28. februar (eller 29. i skudår).
blank Hvis der ikke findes en forskudt dato, skal du returnere tom. Hvis du flytter den 31. marts en måned tilbage, returneres det tomt (da den 31. februar ikke eksisterer).

Overvejelser i forbindelse med arbejde med kalenderbaseret tidsintelligens

  • Udførelse af en tidsintelligensberegning på en faktatabel, der definerer en kalender og er underlagt regler for sikkerhed på rækkeniveau (RLS) og kan føre til uventede resultater.
  • Ydeevnen af denne prøveversionsfunktion er ikke repræsentativ for slutproduktet.
  • Du kan endnu ikke oprette kalendere i Power BI-tjeneste.
  • Du bør ikke bruge automatiske dato-/klokkeslætstabeller med brugerdefinerede kalendere.
  • Du kan ikke bruge kalendere med live-forbundne eller sammensatte modeller.
  • Det anbefales, at du kun tilknytter de kolonner i kalenderen, som du vil bruge i tidsintelligensberegninger.
  • Kalendere er underlagt både realtids - og offlinevalideringer . Du kan gemme din kalender på trods af offlinevalideringsfejl, men det anbefales at løse dem først. Valideringsfejl i realtid skal rettes for at gemme.
  • Hver kalender skal have et entydigt navn i datamodellen
  • En enkelt tabel kan indeholde flere kalendere
  • Den tabel, der indeholder kalenderen, skal have færre end 200 kolonner. Hvis tabellen indeholder mere end 20.000 rækker, er valideringerne ikke tilgængelige, men du kan stadig tilføje en kalender.
  • En kalender skal som minimum tildele én primær kolonne til en kategori
  • En kalender kan kun tildele kolonner fra sin egen tabel til kategorier
  • Hver kategori skal have en primær kolonne og kan have nul eller flere tilknyttede kolonner tildelt
  • DATEADD har nye parametre til styring af udvidelses- og udvidelsesfunktionen, som ikke genkendes i IntelliSense.
  • En given kolonne kan kun knyttes til én kategori
  • Du kan ikke indlejre tidsintelligensfunktioner, der bruger kalendere. Følgende DAX-sætning understøttes f.eks. ikke:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

I stedet kan du gøre:

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

Oprette en datotabel ved hjælp af indbyggede værktøjer

I følgende eksempler oprettes en datotabel fra 1. januar 2010 til 31. december 2030 ved hjælp af enten Power-forespørgsel M eller DAX. Den indeholder følgende kolonner: År, Månedsnummer, Månedsnavn, Månedsår, Kvartal, År, Kvartal, Kvartal, Dag og Dato.

Power-forespørgsel 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]
)

Du kan finde flere oplysninger og flere indstillinger under Datotabeller.

Du kan finde flere oplysninger om denne artikel i følgende ressourcer: