Merk
Tilgang til denne siden krever autorisasjon. Du kan prøve å logge på eller endre kataloger.
Tilgang til denne siden krever autorisasjon. Du kan prøve å endre kataloger.
Power BI tilbyr flere verktøy for å utføre tidsbaserte beregninger, som enten er avhengige av automatiske datotabeller eller datotabeller du legger til.
Vi anbefaler at du bruker kalenderbasert tidsintelligens (forhåndsversjon) fordi det gir den beste ytelsen og den høyeste fleksibiliteten for å oppfylle alle kalendere.
Denne tabellen sammenligner de tre verktøyene som følger med:
| Redskap | Oppsettsinnsats kreves | Enkel administrasjon | Fleksibilitet | Notater |
|---|---|---|---|---|
| Automatisk dato/klokkeslett | Praktisk talt null | vanskelig | lav | Øker modellstørrelsen på grunn av flere skjulte datotabeller som er opprettet |
| Klassisk tidsintelligens | middels | lett | lav | Krever oppretting av en datotabell, forutsetter gregoriansk eller skiftet gregoriansk kalender, lider av ytelsesproblemer i enkelte spesifikke scenarier |
| Kalenderbasert tidsintelligens | høy | middels | høy | Anbefales å lage en datotabell, høyest fleksibilitet, best ytelse, men økte konfigureringskostnader |
Note
Vi fraråder å bruke alternative tidsintelligensteknikker, spesielt de som involverer å legge til ekstra kolonner i datotabeller for å beregne forskyvninger, bortsett fra spesifikke brukstilfeller. Selv om disse tilnærmingene kan appellere til nybegynnere på grunn av deres enkle DAX-formler, har de en tendens til å blåse opp semantiske modeller unødvendig. Denne oppblåsthet kan føre til langsommere dataoppdateringer og redusert rapportytelse etter hvert som datasettene vokser.
Automatisk dato/klokkeslett
Funksjonen for automatisk dato/klokkeslett oppretter automatisk skjulte datotabeller for hvert datofelt i datamodellen. Hvis du vil ha mer informasjon om denne automatiske virkemåten, kan du se Bruke automatisk dato/klokkeslett i Power BI Desktop.
Note
Selv om automatisk dato/klokkeslett er et praktisk alternativ for enkle modeller, anbefales det ikke for mer komplekse scenarier og større modeller. For disse modellene er det å foretrekke å lage et dedikert bord for mer fleksibilitet.
Legge til en datotabell
For de fleste modeller anbefales det å legge til en datotabell (eller mer i noen scenarioer). Mange dataanalytikere foretrekker å lage sine egne datotabeller, noe som er greit.
Det er flere måter å lage en slik tabell på, inkludert:
- Power Query M. Du kan bruke funksjonen List.Dates . Et eksempel er gitt senere i dette dokumentet.
- DAX. Du kan bruke funksjonene KALENDER eller KALENDERAUTO til å generere en grunnleggende beregnet datotabell. Du kan også bruke en mer avansert DAX-setning til å opprette en datotabell. Et eksempel er gitt senere i dette dokumentet.
- Eksterne verktøy.
- Innlasting fra en kilde, for eksempel et kildesystem, en fil eller en annen semantisk modell for Power BI.
Hvilket alternativ som er best for deg, avhenger av ulike faktorer og er utenfor rammen av denne opplæringen.
Arbeide med tidsbaserte beregninger
Forutsatt at du ikke bruker automatisk dato/klokkeslett, finnes det to alternative måter å arbeide med tidsintelligensfunksjoner i Power BI for å utføre tidsbaserte beregninger:
- Klassisk tidsintelligens. Det enkleste alternativet og fungerer utmerket for gregorianske eller forskjøvede gregorianske kalendere, men har begrenset fleksibilitet for kalendere som er strukturert annerledes eller for ukebaserte beregninger.
- Kalenderbasert tidsintelligens (forhåndsversjon). Nyere alternativ, men krever litt mer arbeid å sette opp. Det gir deg imidlertid også bedre ytelse, mer fleksibilitet til å jobbe med ikke-gregorianske kalendere og muligheten til å utføre ukebaserte beregninger.
Note
Du må angi tabellen som en datotabell for bestemte scenarier.
Klassisk tidsintelligens
Dette alternativet krever at du har en datotabell i modellen og angir den deretter. Etterpå kan du bruke tidsintelligensfunksjonene og referere til datotabellen. Hvis du for eksempel har en datotabell kalt Dato i modellen som du angir som datotabell, som inneholder en datokolonne, kan du bruke:
SAMEPERIODLASTYEAR ( 'Date'[Date] )
Selv om dette er en rask og enkel tilnærming, er det mange ulemper sammenlignet med den kalenderbaserte tilnærmingen:
- Det krever at du angir datotabellen
- Det fungerer bare med modeller som har minst én dedikert datotabell
- Datokolonnene som brukes, skal ikke ha manglende datoer mellom første og siste dato. Hvis det mangler datoer mellom første og siste dato, oppstår det en feil.
- den er mindre fleksibel ettersom den er optimalisert for gregorianske eller skiftede gregorianske kalendere, for eksempel regnskapsår som starter 1.
- den gir ikke ukebaserte beregninger
- I bestemte scenarier fungerer ikke tidsbaserte beregninger bra.
Note
Vi anbefaler at du bruker den forbedrede, kalenderbaserte tilnærmingen.
Kalenderbasert tidsintelligens (forhåndsversjon)
Kalendere er metadatadefinisjoner som legges til i en tabell for å angi hvilke kolonner fra tabellen som representerer hvilke attributter for tid. Du kan definere én eller flere kalendere i en hvilken som helst tabell i modellen. Når du har definert kalenderen i modellen, kan du referere til den i tidsintelligensfunksjonene. Slik beregner du for eksempel et totalt år hittil i år for Sales ved hjelp av en definert regnskapskalender:
TOTALYTD ( [Sales], 'Fiscal Calendar' )
Fordeler med kalenderbasert tidsintelligens
De viktigste fordelene med kalenderbasert tidsintelligens er:
Fungerer med alle kalendere
Kalendere gir deg full fleksibilitet til å bestemme hvordan du skal dele opp tid i år, kvartaler, måneder og uker. Du kan for eksempel definere kalenderne som følger disse mønstrene:
- Gregoriansk
- Skiftet gregoriansk
- Detaljhandel (445, 454, 544 mønstre)
- 13-måneders
- Måne
Mulighetene er uendelige siden det ikke er noen innebygd antagelse fra Power BI om hvordan kalenderen din er strukturert. Kalenderbasert tidsintelligens gjør ingen antagelser om de underliggende datoene. Alle beregninger bruker de underliggende dataene nøyaktig as-is.
Sparsomme datoer
Klassisk tidsintelligens krever at datokolonnen som er angitt, er fullstendig – hvis det mangler datoer mellom første og siste dato, oppstår det en feil. Kalenderbaserte tidsintelligensfunksjoner har ikke et slikt krav. I stedet opererer de på datoene as-is. Selv om vi fortsatt anbefaler å ha en komplett og dedikert kalendertabell, trenger du ikke lenger å ha den. Hvis for eksempel alle butikkene dine er stengt i helgen, kan du hoppe over helgedagene siden de ikke har noe salg. Forutsatt at helgen din er lørdag og søndag, kan du nå bruke PREVIOUSDAY med en kalender basert på en tabell som ikke har oppføringer for helgen for å hoppe fra mandag rett til fredag.
Ukebaserte beregninger
Kalenderbasert tidsintelligens leverer DAX-funksjoner direkte som opererer med en ukedetalj. For eksempel kan totaler hittil i uke beregnes direkte ved hjelp av TOTALWTD:
TOTALWTD ( Expr, CalendarName )
Ytelsesforbedringer
Noen scenarier kan vise forbedret ytelse når du sammenligner en kalenderbasert tidsintelligensfunksjon med den klassiske motparten. Et visualobjekt som er gruppert etter uken og utfører en beregning hittil i år ved hjelp av TOTALYTD ( ..., CalendarName ) , bør for eksempel generelt kjøres raskere enn om det klassiske motstykket, TOTALYTD ( ..., TableName[DateColumnName] ), ble brukt. Hvis du vil ha innsikt i hvorfor dette kan skje, kan du se delen Kontekstfjerning .
Aktivere den forbedrede forhåndsversjonen av DAX Time Intelligence
For å komme i gang må du først aktivere forhåndsvisningsfunksjonen Forbedret DAX Time Intelligence .
- I Power BI Desktop går du til Forhåndsvisningsfunksjoner for filalternativer > og innstillinger >> .
- Velg Enhanced DAX Time Intelligence-forhåndsvisningen .
- Velg OK
- Start Power BI Desktop på nytt
Administrere kalendere
Hvis du vil administrere en kalender, høyreklikker du tabellen som inneholder kalenderen, eller som du vil definere kalenderen for, og velger Kalenderalternativer eller velger Kalenderalternativer på båndet Tabellverktøy etter at du har valgt tabellen:
Alternativt kan du bruke eksterne verktøy eller TMDL-visningen for å definere en kalender. Hvis du vil ha mer informasjon, kan du se TMDL-skriptet.
Kalendere vises også i modellutforskeren under tabellen der de er definert:
Skjermbildet for kalenderalternativer
Skjermbildet for kalenderalternativer viser kalenderne som er definert i den valgte tabellen. Her kan du:
- opprette en ny kalender ved å velge Ny kalender
- Rediger en eksisterende kalender ved å velge Rediger
- Slett en eksisterende kalender ved å velge Slett
- angi tabellen som en datotabell ved å velge Merk som datotabell
Tilordne kolonnekategorier
Å definere en kalender innebærer å gi den et navn og tilordne kolonner til kategorier. Hver kategori representerer en tidsenhet, og spesifikke kolonnekategorier er tilgjengelige. Du må minst tilordne én primærkolonne til en kategori for å lagre kalenderen. Hver kategori bør ha en primærkolonne og kan ha null eller flere tilknyttede kolonner. Når kolonner som er knyttet til en kategori, er i kontekst, vet Power BI hvilken tidsenhet de presenterer. For noen funksjoner, for eksempel TOTALMTD Power BI, bruker i tillegg den primære kolonnen som er tilordnet den relevante kategorien i den refererte kalenderen, til å utføre den forespurte beregningen. Hvis du vil tilordne en kolonne til en kategori, velger du kategorien på menyen Legg til kategori , og deretter velger du de primære og valgfrie tilknyttede kolonnene.
Tilgjengelige kolonnekategorier
Tabellen nedenfor viser kategoriene som er tilgjengelige. Tabellen gir også eksempelverdier og kardinaliteter for gregorianske kalendere.
Kategoriene er delt inn i to grupper:
- Fullstendig. Data i kolonner som er tilordnet til Fullført-kategorier, er nok til å identifisere tidsperioden unikt.
- Delvis. Data i kolonner som er tilordnet delvise kategorier, er ikke nok til å identifisere tidsperioden unikt.
| Kategori | Beskrivelse | Type: | Eksempel på kardinalitet i en gregoriansk kalender | Eksempel på kolonneverdier i en gregoriansk kalender |
|---|---|---|---|---|
| Year | Året | Fullstendig |
Y = antall år |
2024, 2025 |
| Kvartal | Kvartalet inkludert året | Fullstendig | 4*Y |
1. kvartal 2024, 2. kvartal 2025 |
| Kvartal i året | Årets kvartal | Partial | 4 |
År kvartal 1, YQ1, Q1, kvartal 2 |
| Month | Måneden inkludert året | Fullstendig | 12*Y ≤ value ≤ 13*Y |
januar 2023, 2024 februar |
| Måned i året | 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 | Uken inkludert året | Fullstendig | 52 ≤ value ≤ 53 |
Uke 50 2023, W50-2023, 2023-W50 |
| Uke i året | Årets uke | Partial | 52 |
Uke 50, V50, 50 |
| Uke i kvartal | Uken i kvartalet | Partial | 13 |
Kvartal uke 10, HV10, 10 |
| Uke i måneden | Uken i måneden | Partial | 5 |
Måned uke 2, MW2, 2 |
| Dato | Datoen | Fullstendig | 365*Y ≤ value ≤ 366*Y |
12/31/2025 |
| Dag i året | Årets dag | Partial | 365 ≤ value ≤366 |
365, D1 |
| Dag i kvartalet | 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 |
| Ukedag | Ukedagen | Partial | 7 |
Ukedag 5, WD5, 5 |
I tillegg til disse kategoriene kan du knytte et hvilket som helst antall kolonner i tabellen til den tidsrelaterte kategorien. Dette er foreløpig ikke mulig i kalenderalternativene, men kan i stedet bare gjøres ved hjelp av eksterne verktøy eller TMDL.
Note
Kontekst for alle kolonner som er tilordnet den tidsrelaterte kategorien, fjernes når du utfører beregninger i alle funksjoner unntatt DATEADD og SAMEPERIODLASTYEAR. Eventuell kontekst for kolonner som er en del av tabellen som kalenderen er definert for, men som ikke er kodet i kalenderen, beholdes.
Note
Vi anbefaler at du bare tilknytter kolonnene i kalenderen som du vil bruke i tidsintelligensberegninger.
Primære kontra tilknyttede kolonner
Hovedkolonnen er obligatorisk for hver kategori. Når denne kolonnen eller tilknyttede kolonner som er tilordnet den samme kategorien i den refererte kalenderen, er i kontekst, eller kategorien kreves for å utføre en beregning, bruker Power BI den primære kolonnen. I tillegg brukes primærkolonnene til sortering. Hvis verdiene i hovedkolonnen ikke tillater at den kan sorteres som forventet, kan du enten konfigurere primærkolonnen til å sortere etter en annen kolonne eller bruke en annen kolonne og gjøre den opprinnelige kolonnen til en tilknyttet kolonne. En kolonne med tekstdata som inneholder månedsnummer og år i formatet (det vil si mm-yyyy, 01-2024, og så videre), sorteres for eksempel ikke riktig på tvers av 02-2024 flere år, men en kolonne som bruker formatetyyyy-mm, vil:
Du kan ha null eller flere tilknyttede kolonner tilordnet til en kategori.
Validation
Det er viktig å validere og teste kalenderen din, slik at du er sikker på at den oppfyller dine behov. Valideringene som tilbys i Power BI inkluderer både sanntidsvalideringer og frakoblede valideringer.
Note
Du kan lagre kalenderen din til tross for valideringsfeil uten nett, men det anbefales å løse dem først. Valideringsfeil i sanntid må rettes for å lagre.
Valideringer i sanntid
Sanntidsvalideringene som utføres på kalenderne er:
- Unikt kalendernavn. Hver kalender må ha et unikt navn i den semantiske modellen.
- Enkelt forening per kalender. En kolonne kan ikke tilhøre mer enn én kategori i samme kalender.
- Periode unikhet. Tildelte kategorier skal identifisere perioden unikt.
- Konsekvent kategorisering. Dette sikrer at kolonner er knyttet til samme kategori på tvers av kalendere.
Periodens unikhet
Det bør alltid være en bane for å identifisere perioden for de tildelte kategoriene.
Når du legger til en delvis kategori, validerer Power BI at en samsvarende kombinasjon av fullstendige eller delvise kategorier også er merket i samme kalender. Hvis det ikke er tilfelle, vises en advarsel.
Når du for eksempel konfigurerer en kalender for ukebaserte beregninger, må du tilordne minst en primærkolonne til ett av følgende sett med kategorier:
- Week
- Uke i året, år
- Uke i kvartal, kvartal
- Uke i kvartal, kvartal i år, år
- Uke i måned, måned
- Uke i måneden, måned i året, år
- Uke i måneden, måned i kvartalet, kvartal
- Uke i måneden, måned i kvartalet, kvartal i året, år
Konsekvent kategorisering
Kolonner må ha en konsekvent kategori på tvers av kalendere. Du kan ikke tilordne den samme kolonnen til forskjellige kategorier, for eksempel År, Kvartal eller tidsrelatert i separate kalendere.
Frakoblede valideringer
Frakoblede valideringer kan potensielt være tidkrevende ettersom de får tilgang til tabelldata. Derfor kjører de ikke automatisk i motsetning til sanntidsvalideringene. Hvis du vil kjøre valideringene, velger du Valider data:
De frakoblede valideringene kontrollerer følgende regler og returnerer en advarsel hvis noen regler blir ugyldige i kalenderen din:
- En kolonne som er knyttet til en kategori, har ikke tomme verdier.
- Kategorier på høyere nivå og lavere nivå har et en-til-mange-kardinalitetsforhold. Kolonner som er knyttet til År-kategorien, bør for eksempel ha en én-til-mange-kardinalitet med kolonner som er knyttet til Måned-kategorien.
- Kolonner som er knyttet til kategorier på samme nivå, har et en-til-en-kardinalitetsforhold. Kolonner som er knyttet til Måned-kategorien, bør for eksempel ha en én-til-én-kardinalitet med kombinasjonene av kolonnene som er knyttet til kategoriene Måned i År og År.
- primære og tilknyttede kolonner som er tilordnet samme kategori, har et en-til-en-kardinalitetsforhold. Når den for eksempel er tilordnet til Måned-kategorien, bør en primærkolonne Måned og en tilknyttet kolonne EnglishMonthName ha en én-til-én-kardinalitet.
Arbeide med kalendere
Når en kalender er definert, kan du referere til den i tidsintelligensfunksjoner. Følgende mål beregner for eksempel en total verdi hittil i måned for Totalt antall mot ISO-454-kalenderen :
Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )
Hvis kalenderen ikke er definert og feilen returneres:
Selv om kalenderen er definert, kan det imidlertid hende at et mål fortsatt returnerer en feil. Dette skjer hvis funksjonen som brukes forventer at en kategori skal være til stede i kalenderen, og kalenderen ikke har denne kategorien. Forventer for eksempel TOTALWTD at bestemte kategorier skal være til stede i kalenderen. Hvis de ikke er det, returneres en feil:
Tidsintelligensfunksjoner og nødvendige kategorier
Mange tidsintelligensfunksjoner krever at det inkluderes tilstrekkelige kategorier i kalenderen som det refereres til i funksjonskallet, slik at Power BI kan identifisere en unik bestemt tidsenhet. Power BI må med andre ord kunne «gå opp» fra nivået beregningen utføres på helt til et enkelt år. Når du for eksempel utfører en beregning på kvartaler, for eksempel ved å bruke TOTALQTD enten Tilordne Kvartalskategori , eller tilordne både Kvartal i År og År i kalenderen som diktert av valideringen Periodeunikhet .
Note
For noen funksjoner er navnet deres en indikasjon på hvilket nivå beregningen opererer (for eksempel TOTALYTD), mens for andre er det avhengig av parameterne og konteksten (for eksempel DATEADD).
Klaring av kontekst
Tidsintelligensfunksjoner fungerer ved å starte på et tidspunkt, og deretter utføre en operasjon på det for å gi et annet tidspunkt. Naturligvis kan det første tidspunktet komme i konflikt med dette resultatet, og dermed forårsake et filterkontekstskjæringspunkt som som standard vil gi delvise eller tomme resultater. Vurder for eksempel følgende scenario.
Definisjon av kalender
Vi har en enkel gregoriansk kalender som merker tre kategorier, definert som:
| Kategori | Primær kolonne |
|---|---|
| Year | Year |
| Måned i året | MonthOfYear |
| Kvartal | Kvartal |
Definisjoner av mål
To grunnleggende mål er definert: ett for å beregne det totale salget, og et annet for å beregne det totale salget fra forrige kvartal:
[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )
Eksempel: Slik fungerer konteksttømming
Tabellvisualobjektet vårt blar gjennom en månedsdetalj ved hjelp av kolonnene Year og MonthOfYear :
| Year | MonthOfYear | Totalt salg | Siste kvartalSalg |
|---|---|---|---|
| 2011 | 1 | 10 | |
| 2011 | 2 | 20 | |
| 2011 | 3 | 30 | |
| 2011 | 4 | 40 | 10 |
| 2011 | 5 | 50 | 20 |
I denne tabellen blar den fete raden på månedsnivå for april 2011. Derfor blir alle mål i denne raden evaluert under filterkonteksten [Year] == 2011 og [MonthOfYear] == 4.
Som forventet beregnes TotalSales her som det totale salget for april 2011.
LastQuarterSales beregner på samme måte TotalSales, men får et ekstra filter fra den DATEADD kalenderbaserte funksjonen.
For denne raden DATEADD vil ha et innledende startpunkt i april 2011, og vil gi tidspunktet som er nøyaktig ett kvartal siden: januar 2011. Som et resultat kan man forvente at denne TotalSales beregnes under følgende to filterkontekster:
- Leveres av nettleserkolonnene for gjeldende rad:
{ [Year] == 2011, [MonthOfYear] == 4 }(Tilsvarende, april 2011) - Leveres av filteret DATEADD :
{ [Year] == 2011, [MonthOfYear] == 1 }(Tilsvarende, januar 2011)
Det er klart at disse to filterkontekstene vil være i konflikt - vi kan ikke evaluere det totale salget gitt inneværende måned som både januar 2011 og april 2011. Et slikt skjæringspunkt ville ikke gi noen resultater.
Dette er imidlertid ikke det som skjer. I stedet, basert på kalenderdefinisjonen, identifiserer kalenderbaserte tidsintelligensfunksjoner hvilke kategoriers kolonner som kan føre til konflikter, etter tidsoperasjonen som funksjonen utfører. I dette tilfellet DATEADD utføres et skift på kvartalsnivå . Funksjonen identifiserer at både kategoriene År og Måned i år kan endres som følge av en endring i kolonnene i kategorien Kvartal . Dermed fjerner funksjonen filterkontekst for alle (både primære og tilknyttede) kolonner som er merket til disse kategoriene.
Med andre ord kan vi si at kategoriene År og Måned i År er avhengigheter av kategorien Kvartal . Omvendt kan vi si at kategorien Kvartal er avhengig av kategoriene År og Måned i året .
Slik fungerer kontekstsletting
Dette diagrammet er gitt for bedre å visualisere avhengighetene mellom de ulike tidskategoriene. Hver kategori i dette gitteret representerer alle kolonner (primære og tilknyttede) som er merket til denne kategorien. Kategorier er koblet til deres avhengigheter via piler. "Måned" er for eksempel avhengig av "År", "Kvartal i året", "Måned i kvartalet", "Kvartal" og "Måned i året".
Når kontekst er angitt for en kolonne eller den tilknyttede sorteringen etter kolonne som er merket i en kalender, fjernes tidligere filterkontekst for:
- Alle kategoriavhengigheter av X. Dette kan betraktes som alle kategorier over X.
- Alle kategoriavhengigheter av både X og dets avhengigheter (det vil si fra 1. ovenfor). Dette kan betraktes som alle kategorier under X og alle kategorier i 1 ovenfor.
Note
Konteksttømming skjer på kolonner som er merket i en kalender eller tilknyttede sorteringskolonner, uavhengig av om konteksten er angitt ved hjelp av tidsintelligensfunksjoner eller på annen måte.
Tidsrelaterte kolonner
De fleste tidsintelligensfunksjoner, bortsett fra DATEADD og SAMEPERIODLASTYEAR, vil fjerne konteksten for alle tidsrelaterte kolonner og tilknyttede sorteringskolonner.
Virkemåte på tvers av kalendere
Hvis det er definert flere kalendere i samme tabell, fullføres disse prosessene for hver kalender som er definert i tabellen. Dette inkluderer bemerkningen om kontekstrydding av tidsrelaterte kolonner. Anta med andre ord at en tabell definerer tre kalendere: Kalender1, Kalender2 og Kalender3. Hvis filterkontekst er satt til kategori "X" i Kalender1, utføres prosessene ovenfor på alle tre kalenderne.
Eksempel: Filteret er angitt på «Kvartal»
Hvis filterkontekst ble satt på kategorien "Kvartal", ville prosessen være som følger.
Først vil alle avhengigheter av "Kvartal"-kategorien bli vurdert.
Deretter vil alle avhengige av "Quarter" og dens avhengigheter bli vurdert.
Til slutt vil sluttresultatet være følgende. Alle rødfargede kategorier vil få sin tidligere filterkontekst fjernet, og ny kontekst settes til Kvartal.
TMDL-skript for 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
Note
Legg merke til at hvis du ikke angir noen kategori for calendarColumnGroup i TMDL, merkes kolonnene som tidsrelaterte. I dette eksemplet er Ferienavn og isWorkingDay tidsrelaterte kolonner i demonstrasjonskalenderen.
Sett alt sammen: Eksempler på tidsforskyvning
Noen tidsintelligensfunksjoner forskyver kontekst bare sideveis, med tanke på alle kolonner, mens andre utfører hierarkiske skift – beholder eller fjerner kontekst basert på om kolonner er merket i kalenderen. Tidsintelligensfunksjonene kan deles inn i to grupper basert på om de tillater hierarkiske skift:
- Fikset. Funksjoner i denne gruppen er DATEADD og SAMEPERIODLASTYEAR. Disse funksjonene tillater bare laterale tidsforskyvninger og returnerer ikke verdier fra et annet detaljnivå.
- Fleksibel. Denne gruppen inneholder alle andre tidsintelligensfunksjoner. Disse funksjonene tillater hierarkiske tidsforskyvninger, og avhengig av kalenderoppsettet kan du returnere resultater fra et annet detaljnivå.
For å vise disse virkemåtene, la oss gå gjennom et eksempel ved hjelp av en enkel datamodell som består av to tabeller, to kalendere og fem mål.
Tabeller og relasjoner
I dette eksemplet har vi følgende enkle datamodell:
| Table | Columns |
|---|---|
| Dato | År, IsWorkingDay, Dato |
| Sales | Ordrenøkkel, antall, ordredato |
Her er noen eksempler på rader i Dato-tabellen :
Her er noen eksempelrader i Salg-tabellen :
Tabellene Salg og Dato er relatert til Ordredato og Dato.
Kalendere
I Dato-tabellen definerte vi kalendere med disse tilordningene:
| Kalender Navn | Kategori | Primær kolonne |
|---|---|---|
| Gregoriansk | Year | Year |
| Dato | Dato | |
| GregorianWithWorkingDay | Year | Year |
| Dato | Dato | |
| Tidsrelatert | IsWorkingDay |
Den tilsvarende TMDL-definisjonen av disse to kalenderne 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
Tiltak
I Salg-tabellen definerer vi følgende mål:
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å sideforskyvning
La oss opprette et visualobjekt som viser Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity og OneYearAgoQuantityTimeRelated for 2024 og 2025:
Alle verdier for OneYearAgoQuantity og OneYearAgoQuantityTimeRelated for 2025 samsvarer med Total Quantity fra nøyaktig ett år før (2024), for den samme IsWorkingDay-verdien .
Dette viser at DATEADD konteksten opprettholdes for alle kolonner i Dato-tabellen som inneholder kalenderen som brukes, uavhengig av om den ikke er kodet, eller om den er merket som tidsrelatert i kalenderen. Siden vi i måldefinisjonene våre instruerte DATEADD oss om å gå tilbake med ett år, var den eneste kolonnen der konteksten ble endret, kolonnen som er knyttet til kategorien År. Hvorvidt IsWorkingDay-kolonnen ble merket i kalenderen som tidsrelatert eller ikke merket i det hele tatt, endret ikke resultatet. Den eneste andre funksjonen som viser denne oppførselen er SAMEPERIODLASTYEAR.
Eksempel på hierarkisk skift
La oss nå se på et eksempel der om en kolonne er merket som tidsrelatert eller ikke, faktisk endrer resultatet.
For dette skal vi opprette det samme visualobjektet på nytt som i det forrige eksemplet, men denne gangen skal vi bruke målene FullLastYearQuantity og FullLastYearQuantityTimeRelated :
Dette viser at PARALLELPERIOD konteksten bevares for kolonner som ikke er merket i kalenderen, men fjerner konteksten for de som er merket som tidsrelaterte. FullLastYearQuantity brukte den gregorianske kalenderen der IsWorkingDay ikke var merket i kalenderen, mens FullLastYearQuantityTimeRelated brukte GregorianWithWorkingDay-kalenderen der IsWorkingDay ble merket som tidsrelatert. All tidsintelligens fungerer bortsett fra DATEADD og SAMEPERIODLASTYEAR oppfører seg på denne måten.
Bonus: Hvis du virkelig ønsker å tvinge disse funksjonene til å bevare konteksten for tidsrelaterte kolonner også, kan du bruke VALUES:
FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )
I dette tilfellet FullLastYearQuantityTimeRelatedOverride returneres de samme resultatene som FullLastYearQuantity.
Konklusjon
Det forseggjorte eksemplet ovenfor viser at forskjellige tidsintelligensfunksjoner oppfører seg forskjellig avhengig av om kolonner er merket som tidsrelaterte i kalenderen. DATEADD og SAMEPERIODLASTYEAR bare utføre laterale tidsforskyvninger. Alle andre tidsintelligensfunksjoner tillater hierarkiske tidsforskyvninger.
Bruk DATEADD med kalendere
Funksjonen DATEADD har spesifikke parametere som gir finkornet kontroll over hvordan skift utføres når valget er på et mer detaljert nivå enn skiftnivået angitt av interval parameteren i DATEADD. Dette skjer for eksempel hvis du viser data på datonivå, men setter parameteren interval til DATEADDMÅNED. For eksempel, i en gregoriansk kalender, når du flytter en periode som strekker seg fra 3 til 10 mars med en måned, vil resultere i 3 til 10 april. Men siden måneder i gregorianske kalendere varierer i lengde, kan dette føre til tvetydigheter når du skifter. Nedenfor er eksempler på scenarier basert på en gregoriansk kalender:
Skift fra en kortere til en lengre periode
Du kan for eksempel flytte én måned fremover med et utvalg i februar, slik at målmåneden er mars.
Du kan bruke parameteren extension til å påvirke hvordan skiftet utføres:
| Parameter for utvidelse | Beskrivelse | Resultat |
|---|---|---|
precise |
Dette holder den opprinnelige datoperioden strengt. | 25.-28. februar er flyttet til 25.-28. |
extended |
Lar vinduet utvides mot slutten av måneden. | 25.-28. februar er flyttet til 25.-31. |
Skift fra en lengre til en kortere periode
Du kan for eksempel skifte én måned bakover med et utvalg i mars, slik at målmåneden er februar.
Du kan bruke parameteren truncation til å påvirke hvordan skiftet utføres:
| Parameter for trunkering | Beskrivelse | Resultat |
|---|---|---|
anchored |
Forankrer resultatet til den siste gyldige datoen i den mindre måneden. | 31. mars er flyttet til 28. |
blank |
Når det ikke finnes en forskjøvet dato, returnerer du tom. | Hvis du flytter 31. mars tilbake en måned, returneres tomt (siden 31. februar ikke eksisterer). |
Viktige punkter om arbeid med kalenderbasert tidsintelligens
- Å utføre en beregning av tidsintelligens på en faktatabell som definerer en kalender og er underlagt regler for sikkerhet på radnivå (RLS) og kan føre til uventede resultater.
- Ytelsen til denne forhåndsvisningsfunksjonen er ikke representativ for sluttproduktet.
- Du kan ikke redigere kalendere i Power BI-tjenesten ennå.
- Du bør ikke bruke tabeller for automatisk dato/klokkeslett med egendefinerte kalendere.
- Du kan ikke bruke kalendere med live-tilkoblede eller sammensatte modeller.
- Vi anbefaler at du bare tilknytter kolonnene i kalenderen som du vil bruke i tidsintelligensberegninger.
- Kalendere er underlagt validering både i sanntid og offline . Du kan lagre kalenderen din til tross for valideringsfeil uten nett, men det anbefales å løse dem først. Valideringsfeil i sanntid må rettes for å lagre.
- Hver kalender må ha et unikt navn i datamodellen
- En enkelt tabell kan inneholde flere kalendere
- Tabellen som inneholder kalenderen, må ha færre enn 200 kolonner. Hvis tabellen inneholder mer enn 20 000 rader, vil ikke valideringene være tilgjengelige, men du kan fortsatt legge til en kalender.
- En kalender må minst tilordne én primærkolonne til en kategori
- En kalender kan bare tilordne kolonner fra sin egen tabell til kategorier
- Hver kategori bør ha en primærkolonne og kan ha null eller flere tilknyttede kolonner tilordnet
- DATEADD har nye parametere for å kontrollere virkemåten for utvidelse og utvidelse, som ikke gjenkjennes i IntelliSense.
- En gitt kolonne kan tilordnes til bare én kategori
- Du kan ikke neste tidsintelligensfunksjoner som bruker kalendere. Følgende DAX-setning støttes for eksempel ikke:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )
I stedet kan du gjøre:
ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )
Opprette en datotabell ved hjelp av innebygde verktøy
Eksemplene nedenfor oppretter en datotabell fra 1 januar 2010 til 31 desember 2030 ved hjelp av enten Power Query M eller DAX. Den inneholder følgende kolonner: År, Månedsnummer, Månedsnavn, Måned, År, Kvartal, År, Kvartal, Dag og Dato.
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]
)
Hvis du vil ha mer informasjon og flere alternativer, kan du se Datotabeller.
Beslektet innhold
Hvis du vil ha mer informasjon relatert til denne artikkelen, kan du se følgende ressurser: