Implementace výpočtů založených na čase v Power BI

Power BI nabízí několik nástrojů pro provádění výpočtů založených na čase, které závisí na automatických tabulkách kalendářních dat nebo tabulkách kalendářních dat, které přidáte.

Doporučujeme používat časové měřítko založené na kalendáři (Preview), protože poskytuje nejlepší výkon a nejvyšší flexibilitu pro splnění libovolného kalendáře.

Tato tabulka porovnává poskytnuté tři nástroje:

Tool Vyžaduje se úsilí o nastavení. Snadná správa Flexibilita Poznámky
Automatické datum a čas prakticky nula tvrdý nízký Zvyšuje velikost modelu kvůli vytvoření více skrytých tabulek kalendářních dat.
Klasická časová inteligence médium snadný nízký Vyžaduje vytvoření tabulky dat, předpokládá použití gregoriánského nebo posunutého gregoriánského kalendáře, a v některých konkrétních scénářích trpí problémy s výkonem.
Kalendářová časová inteligence vysoko médium vysoko Doporučujeme vytvořit tabulku kalendářních dat, nejvyšší flexibilitu, nejlepší výkon, ale vyšší náklady na nastavení.

Poznámka:

Nedoporučujeme používat alternativní techniky časové inteligence, zejména ty, které zahrnují přidání dalších sloupců do tabulek dat k výpočtu posunů, s výjimkou specifických případů použití. I když se tyto přístupy mohou zdát lákavé pro začátečníky díky jednoduchým vzorcům DAX, mohou zbytečně rozšiřovat sémantické modely. To může vést k pomalejšímu obnovování dat a snížení výkonu reportu, jak se datové sady zvětšují.

Automatické datum a čas

Funkce automatického nastavení datumu a času automaticky vytvoří skryté tabulky dat pro každé datové pole v datovém modelu. Další informace o tomto automatickém chování najdete v tématu Použití automatického data a času v Power BI Desktopu.

Poznámka:

I když je automatické datum a čas praktickou možností pro jednoduché modely, nedoporučuje se pro složitější scénáře a větší modely. Pro tyto modely je vhodnější vytvořit vyhrazenou tabulku pro větší flexibilitu.

Přidání tabulky kalendářních dat

U většiny modelů se doporučuje přidat tabulku kalendářních dat (nebo více v některých scénářích). Mnoho datových analytiků dává přednost vytváření vlastních tabulek kalendářních dat, což je v pořádku.

Existuje několik způsobů vytvoření takové tabulky, mezi které patří:

Která možnost je pro vás nejvhodnější, závisí na různých faktorech a je nad rámec tohoto kurzu.

Práce s výpočty založenými na čase

Za předpokladu, že nepoužíváte automatické datum a čas, existují dva alternativní způsoby práce s funkcemi časového měřítka v Power BI k provádění výpočtů založených na čase:

  • Klasická časová inteligence. Nejjednodušší možnost a funguje skvěle pro gregoriánské nebo přesunuté gregoriánské kalendáře, ale má omezenou flexibilitu pro kalendáře, které jsou strukturovány odlišně nebo pro týdenní výpočty.
  • Časové měřítko založené na kalendáři (Preview) Novější možnost, ale k nastavení vyžaduje trochu víc práce. Poskytuje ale také lepší výkon, větší flexibilitu při práci s negregoriánskými kalendáři a možnost provádět týdenní výpočty.

Poznámka:

Tabulku musíte nastavit jako tabulku kalendářních dat pro konkrétní scénáře.

Klasická časová inteligence

Tato možnost vyžaduje, abyste měli v modelu tabulku kalendářních dat a odpovídajícím způsobem ji nastavili. Potom můžete použít funkce časové inteligence a odkazovat na svoji tabulku dat. Pokud máte například tabulku kalendářních dat s názvem Date v modelu, kterou jste nastavili jako tabulku kalendářních dat, která obsahuje sloupec Datum, můžete použít:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

I když se jedná o rychlý a snadný přístup, existuje v porovnání s přístupem založeným na kalendáři mnoho nevýhod:

  • vyžaduje, abyste nastavili tabulku kalendářních dat.
  • funguje jenom s modely, které mají aspoň jednu vyhrazenou tabulku kalendářních dat.
  • Použité sloupce kalendářních dat by neměly obsahovat žádná chybějící kalendářní data mezi prvním a posledním datem. Pokud mezi prvním a posledním datem chybí nějaká kalendářní data, vyvolá se chyba.
  • je méně flexibilní, protože je optimalizovaná pro gregoriánské nebo přesunuté gregoriánské kalendáře, jako jsou fiskální roky, které začínají 1. července, ale stále následují gregoriánský kalendář.
  • neposkytuje týdenní výpočty.
  • v konkrétních scénářích nefungují výpočty založené na čase dobře.

Poznámka:

Doporučujeme použít vylepšený přístup založený na kalendáři .

Inteligence založená na kalendářním čase (náhled)

Kalendáře jsou definice metadat přidané do tabulky, které označují sloupce z této tabulky, které představují atributy času. V libovolné tabulce v modelu můžete definovat jeden nebo více kalendářů. Po definování kalendáře v modelu na něj můžete odkazovat ve funkcích časové analýzy. Tady je příklad, jak vypočítat celkový rok k datu prodeje pomocí definovaného fiskálního kalendáře:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Výhody kalendářem založené časové inteligence

Mezi hlavní výhody kalendářové časové inteligence patří:

Funguje s libovolným kalendářem

Kalendáře poskytují plnou flexibilitu při rozhodování, jak rozdělit čas v letech, čtvrtletích, měsících a týdnech. Můžete například definovat kalendáře, které se řídí těmito vzory:

  • Gregorian
  • Posunutý gregoriánský kalendář
  • Maloobchod (445, 454, 544 schémata)
  • 13měsíční
  • Měsíční

Možnosti jsou nekonečné, protože z Power BI neexistuje žádný předdefinovaný předpoklad, jak je váš kalendář strukturovaný. Časové měřítko založené na kalendáři nepředpokládá podkladová data. Všechny výpočty používají základní data přesně tak, jak jsou.

Řídké termíny

Klasické časové měřítko vyžaduje, aby byl zadaný sloupec kalendářních dat dokončený – pokud mezi prvním a posledním datem chybí nějaká kalendářní data, vyvolá se chyba. Funkce kalendářově založené časové inteligence nemají takový požadavek. Místo toho pracují s daty v jejich aktuální podobě. I když stále doporučujeme mít úplnou a vyhrazenou tabulku kalendáře, už ji nemusíte mít. Pokud jsou například všechny maloobchodní prodejny uzavřeny o víkendu, můžete přeskočit přes víkendové dny, protože nemají žádné prodeje. Za předpokladu, že je víkend sobota a neděle, teď můžete použít PREVIOUSDAY kalendář založený na tabulce, která neobsahuje záznamy o víkendu, abyste mohli přejít z pondělí rovnou do pátku.

Výpočty založené na týdnech

Kalendářová časová inteligence přímo poskytuje funkce DAX, které pracují s týdenní granularitou. Například celkové součty od týdne do data je možné vypočítat přímo pomocí TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Vylepšení výkonu

Některé scénáře můžou vykazovat vyšší výkon při porovnávání funkce časového měřítka založeného na kalendáři s jeho klasickým protějškem. Například vizuál, který je seskupen podle týdne a provádí výpočet k aktuálnímu datu pomocí TOTALYTD ( ..., CalendarName ), by měl být obecně proveden rychleji, než kdyby byl použit jeho klasický protějšek TOTALYTD ( ..., TableName[DateColumnName] ). Informace o tom, proč k tomu může dojít, najdete v části Vymazání kontextu .

Povolit vylepšenou funkci DAX Time Intelligence v náhledové verzi

Abyste mohli začít, musíte nejdřív povolit funkci Rozšířené časové měřítko DAX ve verzi Preview.

  1. V Power BI Desktopu přejděte na Soubor > Možnosti a nastavení > Možnosti > Náhled funkcí.
  2. Vyberte rozšířený náhled časového měřítka DAX .
  3. Vyberte OK.
  4. Restartování Power BI Desktopu

Správa kalendářů

Pokud chcete kalendář spravovat, klikněte pravým tlačítkem myši na tabulku obsahující kalendář nebo na kterou chcete kalendář definovat, a zvolte možnosti kalendáře nebo vyberte možnosti kalendáře na pásu karet Nástroje tabulky po výběru tabulky:

Snímek obrazovky znázorňující vstupní body pro otevření možností kalendáře v tabulce

Případně můžete k definování kalendáře použít externí nástroje nebo zobrazení TMDL . Další informace najdete ve skriptu TMDL.

Kalendáře se také zobrazují v Průzkumníku modelů v tabulce, na které jsou definované:

Snímek obrazovky s průzkumníkem modelů pro sémantický model. Uzel tabulka dat je rozbalený a kalendáře jsou zvýrazněné.

Obrazovka možností kalendáře

Na obrazovce možností kalendáře se zobrazují kalendáře definované ve vybrané tabulce. Tady můžete:

  • Vytvořte nový kalendář výběrem Nový kalendář
  • Úprava existujícího kalendáře výběrem možnosti Upravit
  • Odstranění existujícího kalendáře výběrem možnosti Odstranit
  • Nastavení tabulky jako tabulky kalendářních dat výběrem možnosti Označit jako tabulku kalendářních dat

Snímek obrazovky s možnostmi kalendáře v tabulce

Přiřazení kategorií sloupců

Definování kalendáře zahrnuje pojmenování a přiřazení sloupců kategoriím. Každá kategorie představuje jednotku času a jsou k dispozici konkrétní kategorie sloupců . Abyste mohli kalendář uložit, musíte alespoň přiřadit jeden primární sloupec ke kategorii. Každá kategorie by měla mít primární sloupec a může mít nula nebo více přidružených sloupců. Vždy, když jsou všechny sloupce přidružené ke kategorii v kontextu, Power BI ví, jakou jednotku času představují. Navíc, Power BI u některých funkcí používá primární sloupec přiřazený příslušné kategorii v odkazovaném kalendáři k provedení požadovaného výpočtu. Pokud chcete přiřadit sloupec ke kategorii, vyberte kategorii z nabídky Přidat kategorii a pak vyberte primární a volitelné přidružené sloupce.

Snímek obrazovky znázorňující vytvoření a úpravu kalendáře

Dostupné kategorie sloupců

V následující tabulce jsou uvedeny kategorie, které jsou k dispozici. Tabulka také poskytuje ukázkové hodnoty a kardinality pro gregoriánské kalendáře.

Kategorie jsou rozdělené do dvou skupin:

  • Dokončeno. Data ve sloupcích přiřazených k dokončeným kategoriím stačí k jednoznačné identifikaci časového období.
  • Částečná. Data ve sloupcích přiřazených k částečným kategoriím nestačí k jednoznačné identifikaci časového období.
Kategorie Description Typ Příklad kardinality v gregoriánském kalendáři Příklad hodnot sloupců v gregoriánském kalendáři
Rok Rok Complete Y = počet let 2024, 2025
Čtvrtletí Čtvrtletí včetně roku Complete 4*Y 1. čtvrtletí 2024, 2. čtvrtletí 2025
Čtvrtletí roku Čtvrtletí roku Částečná 4 Rok čtvrtletí 1, RČ1, Q1, čtvrtletí 2
Měsíc Měsíc včetně roku Complete 12*Y ≤ value ≤ 13*Y Leden 2023, 2024 Únor
Měsíc roku Měsíc v roce Částečná 12 Leden, Měsíc roku 11, YM11, M11, 11
Měsíc čtvrtletí Měsíc čtvrtletí Částečná 3 1, QM2
Týden Týden včetně roku Complete 52 ≤ value ≤ 53 Týden 50 2023, W50-2023, 2023-W50
Týden roku Týden v roce Částečná 52 Týden 50, W50, 50
Týden čtvrtletí Týden čtvrtletí Částečná 13 10. týden čtvrtletí, QW10, 10
Týden v měsíci Týden v měsíci Částečná 5 Týden 2, MW2, 2
Date Datum Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
Den roku Den v roce Částečná 365 ≤ value ≤366 365, D1
Den čtvrtletí Den čtvrtletí Částečná 92 Desátý kvartální den, QD2, 50
Den v měsíci Den v měsíci Částečná 31 30. den měsíce, MD10, 30
Den v týdnu Den v týdnu Částečná 7 Den týdne 5, WD5, 5

Kromě těchto kategorií můžete k kategorii Související s časem přidružit libovolný počet sloupců v tabulce. V možnostech kalendáře to momentálně není možné, ale dá se to udělat jenom pomocí externích nástrojů nebo TMDL.

Poznámka:

Kontext všech sloupců přiřazených k kategorii související s časem se odebere při provádění výpočtů ve všech funkcích s výjimkou DATEADD a SAMEPERIODLASTYEAR. Všechny kontexty sloupců, které jsou součástí tabulky, na které je kalendář definovaný, ale nejsou v tomto kalendáři označené, se uchovávají.

Poznámka:

Doporučujeme přidružit pouze ty sloupce ve vašem kalendáři, které chcete používat pro časové inteligentní výpočty.

Primární versus přidružené sloupce

Pro každou kategorii se vyžaduje primární sloupec. Pokaždé, když je daný sloupec nebo jakýkoli přidružený sloupec přiřazený ke stejné kategorii v odkazovaném kalendáři v kontextu nebo je k provedení výpočtu potřeba kategorie, Power BI použije primární sloupec. Kromě toho se primární sloupce používají k řazení. Pokud hodnoty v primárním sloupci neumožňují řazení podle očekávání, můžete primární sloupec nakonfigurovat tak, aby se seřadil podle jiného sloupce , nebo použít jiný sloupec a nastavit původní sloupec jako přidružený sloupec. Například sloupec s textovými daty obsahujícími číslo měsíce a rok ve formátu mm-yyyy (to znamená 01-2024, 02-2024, a tak dále) se nebude správně řadit napříč více roky, ale sloupec, který používá yyyy-mm formát, bude:

Snímek obrazovky se dvěma tabulkami Každá tabulka má jeden sloupec. První tabulka obsahuje sloupec, který obsahuje textové informace o měsíci a roce ve formátu mm-rrrr a druhý obsahuje stejné informace ve formátu rrrr-mm. Sloupec obsahující data formátu mm-rrrr není seřazený správně.

Ke kategorii můžete přiřadit nula nebo více přidružených sloupců.

Validation

Je důležité ověřit a otestovat kalendář, abyste měli jistotu, že splňuje vaše potřeby. Mezi ověření nabízená v Power BI patří ověření v reálném čase i offline ověření.

Poznámka:

Kalendář můžete uložit i přes chyby ověření offline, ale doporučujeme je nejprve vyřešit. Aby bylo možné uložit, je nutné opravit chyby ověření v reálném čase.

Ověřování v reálném čase

Ověření v reálném čase prováděná v kalendářích jsou:

  • Jedinečný název kalendáře Každý kalendář musí mít jedinečný název v sémantickém modelu.
  • Jedno sdružení pro kalendář. Sloupec nemůže patřit do více než jedné kategorie ve stejném kalendáři.
  • Jedinečnost období Přiřazené kategorie by měly jednoznačně identifikovat období.
  • Konzistentní kategorizace. Tím zajistíte, že sloupce jsou přidružené ke stejné kategorii napříč kalendáři.

Jedinečnost období

Vždy by měla existovat cesta k jednoznačné identifikaci období pro přiřazené kategorie.

Pokaždé, když přidáte částečnou kategorii, Power BI ověří, že ve stejném kalendáři je také označená odpovídající kombinace úplných nebo částečných kategorií. Pokud tomu tak není, zobrazí se upozornění.

Snímek obrazovky znázorňující vytvoření a úpravu kalendáře s chybou ověření v reálném čase

Například při nastavování kalendáře pro výpočty založené na týdnech nezapomeňte přiřadit alespoň primární sloupec k jedné z následujících sad kategorií:

  • Týden
  • Týden roku, Rok
  • Týden čtvrtletí, Čtvrtletí
  • Týden čtvrtletí, Čtvrtletí roku, Rok
  • Týden měsíce, měsíc
  • Týden měsíce, Měsíc roku, Rok
  • Týden v měsíci, měsíc ve čtvrtletí, čtvrtletí
  • Týden měsíce, Měsíc čtvrtletí, Čtvrtletí roku, Rok

Konzistentní kategorizace

Sloupce musí mít konzistentní kategorii napříč kalendáři. Stejný sloupec nemůžete přiřadit k různým kategoriím, jako je Year, Quarter of Year nebo time-related v samostatných kalendářích.

Offline ověření

Offline ověřování může být potenciálně časově náročné, protože přistupují k datům tabulky. Proto se nespustí automaticky na rozdíl od ověřování v reálném čase. Ověření spustíte tak, že vyberete Ověřit data:

Snímek obrazovky znázorňující vytvoření a úpravu kalendáře Zvýrazněné tlačítko Ověřit data

Offline ověření zkontroluje následující pravidla a vrátí varování, pokud některá pravidla ve vašem kalendáři budou neplatná:

  • Sloupec přidružený k kategorii nemá prázdné hodnoty.
  • Kategorie vyšší úrovně a nižší úrovně mají poměr kardinality jedna ku mnoha. Například sloupce přidružené k kategorii Rok by měly mít kardinalitu 1:N se sloupci přidruženými k kategorii Měsíc.
  • sloupce přidružené k kategoriím na stejné úrovni mají poměr kardinality 1:1. Například sloupce přidružené k kategorii Měsíc by měly mít kardinalitu 1:1 s kombinacemi sloupců přidružených k kategoriím Měsíc roku a Rok.
  • primární a přidružené sloupce přiřazené stejné kategorii mají poměr kardinality 1:1. Například při přiřazení k kategorii Měsíc by primární sloupec Month a přidružený sloupec EnglishMonthName měly mít kardinalitu 1:1.

Práce s kalendáři

Jakmile je kalendář definovaný, můžete na něj odkazovat ve funkcích časové inteligence. Například následující měřítko vypočítá celkovou hodnotu od začátku měsíce pro celkové množství podle kalendáře ISO-454:

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

Pokud kalendář není definovaný a vrátí se chyba:

Snímek obrazovky znázorňující funkci TOTALMTD, která používá parametr pro neexistující kalendář

I když je však kalendář definovaný, míra může přesto vrátit chybu. K tomu dochází v případě, že použitá funkce očekává, že bude v kalendáři k dispozici kategorie a kalendář tuto kategorii nemá. Očekává například, TOTALWTD že se v kalendáři budou vyskytovat určité kategorie. Pokud ne, vrátí se chyba:

Snímek obrazovky znázorňující míru používající TOTALWTD funkci s platným odkazem na kalendář, který nedefinuje požadované kategorie

Funkce časové inteligence a požadované kategorie

Mnoho funkcí časové inteligence vyžaduje, aby byl v kalendáři, na který odkazuje volání funkce, zahrnut dostatečný počet kategorií, aby Power BI mohl jednoznačně identifikovat konkrétní časovou jednotku. Jinými slovy, Power BI musí být schopný postupně se přesouvat z úrovně, na které se výpočet provádí, až na úroveň jednotlivých roků. Například při provádění výpočtu pro čtvrtletí můžete buď přiřadit TOTALQTD, nebo v kalendáři přiřadit jak čtvrtletí roku, tak rok, jak to vyžaduje ověření jedinečnosti období.

Poznámka:

Pro některé funkce je jejich název indikací toho, na jaké úrovni výpočet probíhá (například TOTALYTD), zatímco u jiných závisí na parametrech a kontextu (například DATEADD).

Vynulování kontextu

Funkce časové inteligence fungují tak, že začínají v určitém bodě v čase a provádějí s ním určitou operaci, aby získaly jiný bod v čase. Přirozeně se může počáteční časový bod dostat do konfliktu s tímto výsledkem, což způsobí průnik kontextu filtru, který v základním nastavení může přinést částečné nebo prázdné výsledky. Představte si například následující scénář.

Definice kalendáře

Máme jednoduchý gregoriánský kalendář, který označuje tři kategorie definované takto:

Kategorie Primární sloupec
Rok Rok
Měsíc roku MonthOfYear
Čtvrtletí Čtvrtletí

Definice měr

Jsou definovány dvě základní míry: jedna pro výpočet celkového prodeje a druhá pro výpočet celkového prodeje z předchozího čtvrtletí:

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

Příklad: Jak funguje vymazání kontextu

Vizuál tabulky prochází členitostí měsíce pomocí sloupců Year a MonthOfYear :

Rok MonthOfYear CelkovéProdeje Tržby za Poslední Čtvrtletí
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

V této tabulce představuje tučný řádek sestavu na měsíční úrovni pro měsíc duben 2011. Proto budou všechny míry v tomto řádku vyhodnoceny v kontextu filtru [Year] == 2011 a [MonthOfYear] == 4.
Podle očekávání se totalSales vypočítá jako celkový prodej za duben 2011.

LastQuarterSales podobně vypočítá totalSales, ale vzhledem k dodatečnému filtru poskytovanému funkcí založenou na DATEADD kalendáři. Pro tento řádek DATEADD by měl počáteční bod v čase duben 2011 a určil by bod v čase, který je přesně před jedním čtvrtletím: leden 2011. V důsledku toho můžete očekávat, že se tento totalSales vypočítá pod následujícími dvěma kontexty filtru:

  • Poskytuje sloupce procházení aktuálního řádku: { [Year] == 2011, [MonthOfYear] == 4 } (Ekvivalentní, duben 2011)
  • Poskytuje filtr DATEADD : { [Year] == 2011, [MonthOfYear] == 1 } (ekvivalentní leden 2011)

Jasně, tyto dva kontexty filtru by byly v konfliktu – celkový prodej vzhledem k aktuálnímu měsíci nemůžeme vyhodnotit jako leden 2011 i duben 2011. Takový průnik by nepřinesl žádné výsledky. To ale není to, co se děje. Místo toho na základě definice kalendáře funkce časového měřítka založeného na kalendáři určují, které sloupce kategorií můžou vést ke konfliktům po operaci času, kterou funkce provádí. V tomto případě DATEADD provede směnu na úrovni čtvrtletí . Funkce identifikuje, že kategorie Year a Month of Year se můžou v důsledku změny ve sloupcích kategorie Čtvrtletí změnit. Funkce tedy vymaže kontext filtru u všech (primárních i přidružených) sloupců, které jsou označené k těmto kategoriím.

Jinými slovy můžeme říci, že kategorie Year a Month of Year jsou závislosti kategorie Čtvrtletí . Naopak můžeme říci, že kategorie Čtvrtletí je závislá na kategoriích Rok a Měsíc roku .

Jak funguje vymazání kontextu

Diagram struktury mřížky všech kategorií kalendáře

Tento diagram je k dispozici pro lepší vizualizaci závislostí mezi různými časovými kategoriemi. Každá kategorie v této mřížce představuje všechny sloupce (primární a přidružené) označené k této kategorii. Kategorie jsou propojeny s jejich závislostmi prostřednictvím šipek. Například "Měsíc" je závislý na "Rok", "Čtvrtletí roku", "Měsíc čtvrtletí", "Čtvrtletí" a "Měsíc roku".

Pokud je kontext nastavený u sloupce nebo u jeho přidruženého řazení podle sloupce, který je označený v kalendáři, předchozí kontext filtru se vymaže při:

  1. Všechny závislosti kategorií X. To si můžete představit jako všechny kategorie nad X.
  2. Všechny závislé kategorie x i jejích závislostí (tj. od 1. výše). To si můžete představit jako všechny kategorie pod X a všechny kategorie v 1 výše.

Poznámka:

Vymazání kontextu probíhá u sloupců označených v kalendáři nebo přidružených sloupcích řazení podle bez ohledu na to, jestli je kontext nastavený pomocí funkcí časového měřítka nebo jinak.

Většina funkcí pro práci s časem, s výjimkou DATEADD a SAMEPERIODLASTYEAR, vymaže kontext všech sloupců souvisejících s časem a přidružených sloupců řazení.

Chování mezi kalendáři

Pokud je ve stejné tabulce definováno více kalendářů, jsou tyto procesy dokončeny pro každý kalendář definovaný v tabulce. To zahrnuje poznámku týkající se vymazání kontextu sloupců souvisejících s časem. Jinými slovy, předpokládejme, že tabulka definuje tři kalendáře: Kalendář1, Kalendář2 a Kalendář3. Pokud je kontext filtru nastavený na kategorii X v kalendáři 1, výše uvedené procesy se provádějí ve všech třech kalendářích.

Příklad: Filtr nastavený na čtvrtletí

Pokud by byl kontext filtru nastaven na kategorii Čtvrtletí, proces by byl následující.

  1. Za prvé budou zváženy všechny závislosti kategorie "Čtvrtletí".

    Příklad vymazání kontextu filtru počínaje kategorií Čtvrtletí: Závislosti.

  2. Dále by se zvažovaly všechny závislosti "Quarter" a jeho závislých.

    Příklad chování při vymazání kontextu filtru, které začíná kategorií Čtvrtletí: Závislosti.

  3. Konečný výsledek by nakonec byl následující. Všechny červené kategorie budou mít předchozí kontext filtru odstraněn a nový kontext bude nastaven na čtvrtletí.

    Příklad vymazání kontextu filtru počínaje kategorií Čtvrtletí: Výsledky

Skript TMDL pro kalendáře

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

Poznámka:

Všimněte si, že pokud pro TMDL nezadáte žádnou kategorii calendarColumnGroup , budou sloupce označené jako související s časem. V tomto příkladu jsou sloupce související s časem v ukázkovém kalendářiNázev svátku a isWorkingDay.

Seskupte vše dohromady: Příklady posunu času

Některé funkce časové inteligence posunují kontext pouze laterálně, zvažují všechny sloupce, zatímco jiné provádějí hierarchické posuny – zachovávají nebo vymazávají kontext podle toho, zda jsou sloupce označené v kalendáři. Funkce časové inteligence je možné rozdělit do dvou skupin na základě toho, jestli umožňují hierarchické posuny.

  • Opraveno. Funkce v této skupině jsou DATEADD a SAMEPERIODLASTYEAR. Tyto funkce umožňují pouze laterální časové posuny a nevrací hodnoty z jiné úrovně podrobností.
  • Flexibilní. Tato skupina obsahuje všechny ostatní funkce časové inteligence. Tyto funkce umožňují hierarchické časové posuny a v závislosti na nastavení kalendáře můžou vracet výsledky z jiné úrovně podrobností.

Abychom ukázali toto chování, projdeme si příklad pomocí jednoduchého datového modelu, který se skládá ze dvou tabulek, dvou kalendářů a pěti měr.

Tabulky a vztahy

V tomto příkladu máme následující jednoduchý datový model:

Table Columns
Date Rok, IsWorkingDay, Datum
Sales KlíčObjednávky, Množství, DatumObjednávky

Tady je několik příkladů řádků v tabulce Kalendářní datum : Snímek obrazovky znázorňující prvních 14 řádků ukázkové tabulky Kalendářní datum. Tabulka definuje datum, rok a IsWorkingDay. Sloupec Datum obsahuje datum, sloupec Rok, hodnotu roku a sloupec IsWorkingDay je logický sloupec (Pravda/Nepravda), který označuje, jestli je datum pracovní den nebo ne.

Tady je několik ukázkových řádků v tabulce Sales (Prodej ): Snímek obrazovky znázorňující prvních devět řádků ukázkové tabulky Sales (Prodej). Tabulka definuje OrderKey, OrderDate a Order Quantity. Sloupec OrderKey obsahuje jedinečné číslo pro každou prodejní objednávku, DatumObjednávky je datum, které souvisí s datem a Množství objednávky je číselný sloupec, který představuje počet produktů pro každou objednávku.

Tabulky Sales a Date jsou propojené přes OrderDate a Date.

Snímek obrazovky zobrazující zobrazení modelu pro ukázkový model Zobrazuje tabulku Sales (Prodej) a Date (Datum) a relaci 1:N mezi nimi v datech OrderDate (DatumObjednávky) a Date (Datum).

Kalendáře

V tabulce Date jsme definovali kalendáře s těmito mapováními:

NázevKalendáře Kategorie Primární sloupec
Gregoriánský Rok Rok
Date Date
Gregoriánský kalendář s pracovním dnem Rok Rok
Date Date
Související s časem JePracovníDen

Ekvivalentní definice TMDL těchto dvou kalendářů je:

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   

Opatření

V tabulce Sales definujeme následující míry:

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

Příklad laterálního posunu

Pojďme vytvořit vizuál, který zobrazuje Rok, Měsíc v roce, Je pracovní den, Celkové množství, Množství před rokem a Časově související množství před rokem pro roky 2024 a 2025.

Snímek obrazovky znázorňující vizuál tabulky, který zobrazuje Rok, IsWorkingDay, Total Quantity, OneYearAgoQuantity a OneYearAgoQuantityTimeRelated Hodnoty OneYearAgoQuantity a OneYearAgoQuantityTimeRelated pro 2025 odpovídají hodnotám pro 2024 pro stejné hodnoty IsWorkingDay.

Všechny hodnoty pro OneYearAgoQuantity a OneYearAgoQuantityTimeRelated pro rok 2025 odpovídají celkovému množství z přesně jednoho roku před (2024) pro stejnou hodnotu IsWorkingDay .

To ukazuje, že DATEADD udržuje kontext v libovolném sloupci tabulky Datum, který obsahuje použitý kalendář, bez ohledu na to, zda není označen, nebo je v tomto kalendáři označen jako související s časem. Vzhledem k tomu, že v měřicích definicích jsme uvedli DATEADD k posunu zpět o jeden rok, jediný sloupec, jehož kontext byl posunut zpět, byl sloupec přidružený k kategorii Rok. Jestli byl sloupec IsWorkingDay v kalendáři označený jako související s časem nebo vůbec nebyl označen, nezměnil výsledek. Jedinou další funkcí, která toto chování vykazuje, je SAMEPERIODLASTYEAR.

Příklad hierarchického posunu

Nyní se podíváme na příklad, ve kterém skutečnost, zda je sloupec označen jako související s časem, skutečně změní výsledek.

V tomto případě znovu vytvoříme stejný vizuál jako v předchozím příkladu, ale tentokrát použijeme míry FullLastYearQuantity a FullLastYearQuantityTimeRelated: Snímek obrazovky znázorňující vizuál tabulky, který zobrazuje Rok, IsWorkingDay, Total Quantity, FullLastYearQuantity a FullLastYearQuantityTimeRelated. Hodnoty FullLastYearQuantity 2025 odpovídají hodnotám pro 2024 pro stejné hodnoty IsWorkingDay, ale hodnoty FullLastYearQuantityTimeRelated se rovnají celkové hodnotě množství bez ohledu na hodnoty IsWorkingDay.

To ukazuje, že zachovává kontext pro sloupce, které PARALLELPERIOD nejsou označené v kalendáři, ale vymaže kontext pro ty, které jsou označené jako související s časem. FullLastYearQuantity použil gregoriánský kalendář, ve kterém IsWorkingDay nebyl označen v kalendáři, zatímco FullLastYearQuantityTimeRelated použil kalendář GregoriánskýWithWorkingDay, kde byl IsWorkingDay označen jako související s časem. Všechny funkce časové inteligence s výjimkou DATEADD a SAMEPERIODLASTYEAR se chovají tímto způsobem.

Pokud byste opravdu chtěli přimět tyto funkce, aby zachovaly kontext i pro sloupce související s časem, můžete použít VALUES:

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

V tomto případě FullLastYearQuantityTimeRelatedOverride vrátí stejné výsledky jako FullLastYearQuantity.

Conclusion

Složitý příklad výše ukazuje, že různé funkce časové inteligence se chovají odlišně v závislosti na tom, zda jsou sloupce v kalendáři označené jako časové. DATEADD a SAMEPERIODLASTYEAR provádějí pouze laterální časové posuny. Všechny ostatní funkce časové inteligence umožňují hierarchické časové posuny.

Použití DATEADD a DATESINPERIOD s kalendáři

Funkce DATEADDDATESINPERIOD má specifické parametry, které umožňují detailní kontrolu nad tím, jak se posuny provádějí, když je výběr na podrobnější úrovni než úroveň posunu určená parametrem interval . K tomu dochází například v případě, že zobrazujete data na úrovni data, ale nastavíte interval parametr na tyto funkce na MĚSÍC. Například v gregoriánském kalendáři při posunu období od 3. do 10. března o měsíc výsledkem bude období od 3. do 10. dubna. Vzhledem k tomu, že měsíce v gregoriánských kalendářích se liší délkou, může to vést k nejednoznačnostem při posunu. Níže jsou uvedeny příklady scénářů založených na gregoriánském kalendáři:

Přechod z kratšího na delší období

Například posun o jeden měsíc dopředu s výběrem v únoru, takže cílový měsíc je březen. Parametr extension můžete použít na DATEADD k ovlivnění způsobu provedení posunu:

Hodnota parametru rozšíření Description Result
precise Tím se přísně zachová původní rozsah dat. 25.–28. února se přesouvá na 25.–28. března.
extended Umožňuje rozšíření okna do konce měsíce. Únor 25-28 se přesouvá na březen 25-31.
endaligned Sladí koncové datum s koncem cílového měsíce, když výběr dosáhne konce měsíce; jinak zachovává relativní pozice. 28. února se posune na 31. března, zatímco 27. února se posune na 27. března.

Poznámka:

DATESINPERIOD poskytuje parametr endbehavior, který nabízí možnosti precise a endaligned.

Přechod z delšího na kratší období

Například posun o měsíc zpět s výběrem v březnu, takže cílový měsíc je únor.

Parametr truncation můžete použít na DATEADD k ovlivnění způsobu provedení posunu:

Hodnota parametru ořezání Description Result
anchored Ukotvení výsledku k poslednímu platnému datu menšího měsíce. 31. března se posune na 28. února (nebo 29 v přestupném roce).
blank Pokud posunuté datum neexistuje, vraťte prázdnou hodnotu. Posun 31. března zpět o měsíc vrátí prázdnou hodnotu (od 31. února neexistuje).

Poznámka:

Tento parametr není k dispozici pro DATEINPERIOD.

Důležité úvahy o práci s kalendářově založenou časovou inteligencí

  • Provádění výpočtu časového měřítka v tabulce faktů, která definuje kalendář a podléhá pravidlům zabezpečení na úrovni řádků (RLS) a může vést k neočekávaným výsledkům.
  • Výkon této funkce Preview není reprezentativní pro koncový produkt.
  • Kalendáře ve službě Power BI zatím nemůžete vytvářet.
  • Neměli byste používat tabulky automatického data a času u vlastních kalendářů.
  • Kalendáře nemůžete používat s živými připojenými nebo složenými modely.
  • Doporučujeme přidružit pouze ty sloupce ve vašem kalendáři, které chcete používat pro časové inteligentní výpočty.
  • Kalendáře podléhají ověřování v reálném čase i offline . Kalendář můžete uložit i přes chyby ověření offline, ale doporučujeme je nejprve vyřešit. Aby bylo možné uložit, je nutné opravit chyby ověření v reálném čase.
  • Každý kalendář musí mít jedinečný název v rámci datového modelu.
  • Jedna tabulka může obsahovat více kalendářů.
  • Tabulka, která obsahuje kalendář, musí mít méně než 200 sloupců. Pokud tabulka obsahuje více než 20 000 řádků, ověření nebudou k dispozici, ale stále můžete přidat kalendář.
  • Kalendář musí alespoň přiřadit jeden primární sloupec ke kategorii.
  • Kalendář může přiřadit pouze sloupce z vlastní tabulky do kategorií.
  • Každá kategorie by měla mít primární sloupec a může mít přiřazené nula nebo více přidružených sloupců.
  • DATEADD má nové parametry pro řízení rozšíření a jeho chování, které nejsou rozpoznány v IntelliSense.
  • Libovolný daný sloupec lze mapovat pouze na jednu kategorii.
  • Funkce časové inteligence, které používají kalendáře, nemůžete vnořit. Například následující příkaz DAX není podporován:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Místo toho můžete:

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

Vytvoření tabulky kalendářních dat pomocí předdefinovaných nástrojů

Následující příklady vytvoří tabulku kalendářních dat od 1. ledna 2010 do 31. prosince 2030 pomocí Power Query M nebo DAX. Obsahuje následující sloupce: Rok, Číslo měsíce, Název měsíce, Rok měsíce, Čtvrtletí, Čtvrtina roku, Den a Datum.

Power Query M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

Další informace a další možnosti naleznete v tabulkách kalendářních dat.

Další informace související s tímto článkem najdete v následujících zdrojích informací: