Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
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:
- Power-forespørgsel M. Du kan bruge funktionen Listedatoer . Et eksempel findes senere i dette dokument.
- DAX. Du kan bruge funktionerne KALENDER eller KALENDERAUTO til at generere en grundlæggende beregnet datotabel. Du kan også bruge en mere avanceret DAX-sætning til at oprette en datotabel. Et eksempel findes senere i dette dokument.
- Eksterne værktøjer.
- Indlæsning fra en kilde, f.eks. et kildesystem, en fil eller en anden semantisk Power BI-model.
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 .
- I Power BI Desktop skal du gå til Filindstillinger > og indstillinger > Indstillinger > Eksempelfunktioner.
- Vælg Enhanced DAX Time Intelligence-prøveversionen.
- Vælg OK
- 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:
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æ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
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.
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
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.
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:
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:
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:
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
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:
- Alle kategoriafhængigheder af X. Dette kan betragtes som alle kategorier over X.
- 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.
Tidsrelaterede kolonner
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.
For det første vil alle afhængigheder af kategorien "Kvartal" blive taget i betragtning.
Dernæst vil alle afhængige af "Quarter" og dets afhængigheder blive taget i betragtning.
Endelig ville slutresultatet være følgende. Alle rødfarvede kategorier vil få deres tidligere filterkontekst fjernet, og ny kontekst er sat til Kvartal.
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 :
Her er nogle eksempelrækker i tabellen Salg :
Tabellerne Salg og Dato er relateret til 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:
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:
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.
Relateret indhold
Du kan finde flere oplysninger om denne artikel i følgende ressourcer: