Udostępnij przez


Implementowanie obliczeń opartych na czasie w usłudze Power BI

Usługa Power BI oferuje wiele narzędzi do wykonywania obliczeń opartych na czasie, które opierają się na automatycznych tabelach dat lub dodanych tabelach dat.

Zalecamy korzystanie z analizy czasowej opartej na kalendarzu (wersja zapoznawcza), ponieważ zapewnia najlepszą wydajność i najwyższy zakres elastyczności w celu spełnienia dowolnego kalendarza.

W tej tabeli porównaliśmy trzy dostępne narzędzia:

Tool Wymagane nakłady pracy instalatora Łatwość zarządzania Elastyczność Notatki
Automatyczna data/godzina praktycznie zero twardy  Niski Zwiększa rozmiar modelu z powodu wielu utworzonych ukrytych tabel dat
Klasyczna analiza czasowa nośnik łatwy  Niski Wymaga utworzenia tabeli dat i zakłada stosowanie kalendarza gregoriańskiego lub zmodyfikowanego gregoriańskiego, co w niektórych konkretnych scenariuszach może prowadzić do problemów z wydajnością.
Analiza czasowa oparta na kalendarzu wysoki nośnik wysoki Zaleca się utworzenie tabeli dat, najwyższa elastyczność, najlepsza wydajność, ale zwiększone koszty konfiguracji

Uwaga / Notatka

Odradzamy korzystanie z alternatywnych technik inteligencji czasowej, szczególnie tych, które obejmują dodawanie dodatkowych kolumn do tabel dat w celu obliczenia przesunięć, z wyjątkiem konkretnych przypadków użycia. Chociaż te podejścia mogą być atrakcyjne dla początkujących ze względu na ich proste formuły języka DAX, mają tendencję do niepotrzebnego zawyżania modeli semantycznych. To przepełnienie może prowadzić do wolniejszego odświeżania danych i obniżonej wydajności raportów w miarę zwiększania się zestawów danych.

Automatyczna data/godzina

Funkcja automatycznego datowania/czasu automatycznie tworzy ukryte tabele dat dla każdego pola daty w modelu danych. Aby uzyskać więcej informacji na temat tego automatycznego zachowania, zobacz Stosowanie automatycznej daty/godziny w programie Power BI Desktop.

Uwaga / Notatka

Chociaż automatyczna data/godzina jest wygodną opcją dla prostych modeli, nie jest zalecana w przypadku bardziej złożonych scenariuszy i większych modeli. W przypadku tych modeli lepiej jest utworzyć dedykowaną tabelę, aby uzyskać większą elastyczność.

Dodawanie tabeli dat

W przypadku większości modeli zaleca się dodanie tabeli dat (lub więcej w niektórych scenariuszach). Wielu analityków danych woli tworzyć własne tabele dat, co jest w porządku.

Istnieje wiele sposobów tworzenia takiej tabeli, w tym:

Która opcja jest najlepsza dla Ciebie zależy od różnych czynników i wykracza poza zakres tego samouczka.

Praca z obliczeniami opartymi na czasie

Zakładając, że nie używasz automatycznej daty/godziny, istnieją dwa alternatywne sposoby pracy z funkcjami analizy czasowej w usłudze Power BI w celu wykonywania obliczeń opartych na czasie:

  • Klasyczna analiza czasowa. Najprostszą opcją, która działa świetnie w przypadku kalendarzy gregoriańskich lub zmienionych kalendarzy gregoriańskich, ale ma ograniczoną elastyczność w przypadku kalendarzy o różnej strukturze lub obliczeń opartych na tygodniu.
  • Analiza czasowa oparta na kalendarzu (wersja zapoznawcza). Nowsza opcja, ale wymaga nieco więcej pracy w celu skonfigurowania. Jednak zapewnia również lepszą wydajność, większą elastyczność pracy z kalendarzami niegregoriańskimi oraz możliwość wykonywania obliczeń opartych na tygodniu.

Uwaga / Notatka

Musisz ustawić tabelę jako tabelę dat dla określonych scenariuszy.

Klasyczna analiza czasowa

Ta opcja wymaga, aby tabela dat w modelu była ustawiona odpowiednio. Następnie możesz użyć funkcji analizy czasowej i odwołać się do tabeli dat. Jeśli na przykład masz tabelę o nazwie Data w swoim modelu, którą ustawisz jako tabelę dat, zawierającą kolumnę o nazwie Data, możesz użyć następujących opcji:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Chociaż jest to szybkie i łatwe podejście, istnieje wiele wad w porównaniu z podejściem opartym na kalendarzu:

  • wymaga ustawienia tabeli dat
  • działa tylko z modelami, które mają co najmniej jedną dedykowaną tabelę dat
  • kolumny dat, których użyto, nie powinny zawierać brakujących dat między pierwszą i ostatnią datą. Jeśli między pierwszymi i ostatnimi datami brakuje dat, zostanie zgłoszony błąd.
  • jest mniej elastyczny, ponieważ jest zoptymalizowany pod kątem kalendarzy gregoriańskich lub przesuniętych gregoriańskich, takich jak lata fiskalne, które rozpoczynają się 1 lipca, ale nadal są zgodne z kalendarzem gregoriańskim
  • nie udostępnia obliczeń opartych na tygodniu
  • w określonych scenariuszach obliczenia oparte na czasie nie działają prawidłowo.

Uwaga / Notatka

Zalecamy użycie rozszerzonego podejścia opartego na kalendarzu .

Analiza czasowa oparta na kalendarzu (wersja zapoznawcza)

Kalendarze to definicje metadanych dodane do tabeli, aby wskazać, które kolumny z tej tabeli reprezentują atrybuty czasu. Można zdefiniować jeden lub więcej kalendarzy w dowolnej tabeli w modelu. Po zdefiniowaniu kalendarza w modelu można odwoływać się do niego w funkcjach analizy czasowej. Na przykład poniżej przedstawiono sposób obliczania całkowitego roku do daty sprzedaży przy użyciu zdefiniowanego kalendarza obrachunkowego:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Zalety analizy czasowej opartej na kalendarzu

Główne zalety analizy czasowej opartej na kalendarzu to:

Działa z dowolnym kalendarzem

Kalendarze zapewniają pełną elastyczność, aby zdecydować, jak dzielić czas w latach, kwartałach, miesiącach i tygodniach. Możesz na przykład zdefiniować kalendarze, które są zgodne z następującymi wzorcami:

  • Gregorian
  • Przesunięty gregoriański
  • Sprzedaż detaliczna (wzorce 445, 454, 544)
  • 13 miesięcy
  • Księżycowy

Możliwości są nieograniczone, ponieważ nie ma wbudowanego założenia z usługi Power BI na temat struktury kalendarza. Analiza czasowa oparta na kalendarzu nie przyjmuje żadnych założeń dotyczących bazowych dat. Wszystkie obliczenia używają danych źródłowych dokładnie tak, jak są.

Rzadkie daty

Klasyczna analiza czasowa wymaga ukończenia podanej kolumny dat — jeśli istnieją brakujące daty między pierwszymi i ostatnimi datami, zostanie zgłoszony błąd. Funkcje analizy czasowej oparte na kalendarzu nie mają takiego wymagania. Zamiast tego działają one na datach w ich pierwotnej formie. Mimo że nadal zalecamy posiadanie pełnej i dedykowanej tabeli kalendarza, nie musisz już tego mieć. Jeśli na przykład wszystkie sklepy detaliczne są zamknięte w weekend, możesz pominąć dni weekendowe, ponieważ nie mają żadnej sprzedaży. Zakładając, że weekend to sobota i niedziela, możesz teraz używać PREVIOUSDAY z kalendarzem opartym na tabeli, która nie zawiera wpisów na weekend, aby przechodzić bezpośrednio z poniedziałku na piątek.

Obliczenia oparte na tygodniu

Analiza czasowa oparta na kalendarzu bezpośrednio udostępnia funkcje DAX, które działają na poziomie tygodniowym. Na przykład, sumy od początku tygodnia można obliczyć bezpośrednio przy użyciu TOTALWTD.

TOTALWTD ( Expr, CalendarName )

Ulepszenia wydajności

Niektóre scenariusze mogą wykazywać lepszą wydajność podczas porównywania funkcji analizy czasowej opartej na kalendarzu z klasycznym odpowiednikiem. Na przykład wizualizacja, która jest pogrupowana według tygodnia i wykonuje obliczenie od początku roku, korzystając z TOTALYTD ( ..., CalendarName ), powinna być wykonywana szybciej niż w przypadku użycia jej klasycznego odpowiednika TOTALYTD ( ..., TableName[DateColumnName] ). Aby uzyskać szczegółowe informacje na temat tego, dlaczego może się to zdarzyć, zapoznaj się z sekcją Czyszczenie kontekstu .

Włącz rozszerzoną wersję zapoznawczą inteligencji czasowej DAX

Aby rozpocząć pracę, musisz najpierw włączyć funkcję rozszerzonej analizy czasowej języka DAX w wersji zapoznawczej.

  1. W programie Power BI Desktop przejdź do Plik > Opcje i ustawienia > Opcje > Funkcje podglądu.
  2. Wybierz wersję zapoznawczą Enhanced DAX Time Intelligence.
  3. Wybierz przycisk OK
  4. Uruchom ponownie program Power BI Desktop

Zarządzanie kalendarzami

Aby zarządzać kalendarzem, kliknij prawym przyciskiem myszy tabelę zawierającą kalendarz lub kalendarz, na którym chcesz zdefiniować kalendarz, a następnie wybierz pozycję Opcje kalendarza lub wybierz pozycję Opcje kalendarza na wstążce Narzędzia tabel po wybraniu tabeli:

Zrzut ekranu przedstawiający punkty wejścia, aby otworzyć opcje kalendarza w tabeli.

Alternatywnie możesz użyć narzędzi zewnętrznych lub widoku TMDL do zdefiniowania kalendarza. Aby uzyskać więcej informacji, zobacz skrypt języka TMDL.

Kalendarze są również wyświetlane w Eksploratorze modeli w tabeli, na której są zdefiniowane:

Zrzut ekranu ukazujący eksplorator modeli dla modelu semantycznego. Węzeł tabeli dat jest rozwinięty, a kalendarze są wyróżnione.

Ekran opcji kalendarza

Na ekranie opcji kalendarza są wyświetlane kalendarze zdefiniowane w wybranej tabeli. W tym miejscu możesz:

  • utwórz nowy kalendarz, wybierając pozycję Nowy kalendarz
  • edytuj istniejący kalendarz, wybierając pozycję Edytuj
  • usuń istniejący kalendarz, wybierając pozycję Usuń
  • ustaw tabelę jako tabelę dat , wybierając pozycję Oznacz jako tabelę dat

Zrzut ekranu przedstawiający opcje kalendarza w tabeli.

Przypisywanie kategorii kolumn

Definiowanie kalendarza obejmuje nadanie mu nazwy i przypisywanie kolumn do kategorii. Każda kategoria reprezentuje jednostkę czasu i dostępne są określone kategorie kolumn . Aby zapisać kalendarz, musisz przypisać co najmniej jedną kolumnę podstawową do kategorii. Każda kategoria powinna mieć kolumnę podstawową i może mieć zero lub więcej skojarzonych kolumn. Za każdym razem, gdy wszystkie kolumny skojarzone z kategorią znajdują się w kontekście usługi Power BI, wie, jaką jednostkę czasu przedstawiają. Ponadto w przypadku niektórych funkcji, takich jak TOTALMTD usługa Power BI, używa kolumny podstawowej zamapowanej do odpowiedniej kategorii w odwołanym kalendarzu w celu wykonania żądanego obliczenia. Aby przypisać kolumnę do kategorii, wybierz kategorię z menu Dodaj kategorię , a następnie wybierz kolumny podstawowe i opcjonalne skojarzone.

Zrzut ekranu przedstawiający tworzenie kalendarza i ekran edycji.

Dostępne kategorie kolumn

W poniższej tabeli przedstawiono dostępne kategorie. Tabela zawiera również przykładowe wartości i liczności dla kalendarzy gregoriańskich.

Kategorie są podzielone na dwie grupy:

  • Ukończ. Dane w kolumnach przypisanych do pełnych kategorii wystarczą, aby jednoznacznie zidentyfikować przedział czasu.
  • Częściowe. Dane w kolumnach przypisanych do kategorii Częściowych nie są wystarczające, aby jednoznacznie zidentyfikować okres.
Kategoria Description Typ Przykładowa kardynalność w kalendarzu gregoriańskim Przykładowe wartości kolumn w kalendarzu gregoriańskim
Rok Rok Complete Y = liczba lat 2024, 2025
Kwartał Kwartał obejmujący rok Complete 4*Y I kw. 2024, II kw. 2025
Kwartał roku Kwartał roku Częściowe 4 Kwartał roku 1, YQ1, Q1, Kwartał 2
Miesiąc Miesiąc, w tym rok Complete 12*Y ≤ value ≤ 13*Y Styczeń 2023 r. 2024 luty
Miesiąc roku Miesiąc roku Częściowe 12 Styczeń, Rok, miesiąc 11, YM11, M11, 11
Miesiąc kwartału Miesiąc kwartału Częściowe 3 1, QM2
Tydzień Tydzień wraz z rokiem Complete 52 ≤ value ≤ 53 Tydzień 50 2023, W50-2023, 2023-W50
Tydzień roku Tydzień roku Częściowe 52 Tydzień 50, W50, 50
Tydzień kwartału Tydzień kwartału Częściowe 13 Tydzień kwartału 10, QW10, 10
Tydzień miesiąca Tydzień miesiąca Częściowe 5 Tydzień 2 miesiąca, MW2, 2
Date Data Complete 365*Y ≤ value ≤ 366*Y 12/31/2025
Dzień Roku Dzień roku Częściowe 365 ≤ value ≤366 365, D1
Dzień kwartału Dzień kwartału Częściowe 92 Dzień kwartału 10, QD2, 50
Dzień miesiąca Dzień miesiąca Częściowe 31 Dzień miesiąca 30, MD10, 30
Dzień tygodnia Dzień tygodnia Częściowe 7 Dzień tygodnia 5, WD5, 5

Oprócz tych kategorii można skojarzyć dowolną liczbę kolumn w tabeli z kategorią Związaną z czasem . Nie jest to obecnie możliwe w opcjach kalendarza, ale zamiast tego można to zrobić tylko przy użyciu narzędzi zewnętrznych lub języka TMDL.

Uwaga / Notatka

Kontekst dla wszystkich kolumn przypisanych do kategorii związanej z czasem jest usuwany podczas wykonywania obliczeń we wszystkich funkcjach z wyjątkiem DATEADD i SAMEPERIODLASTYEAR. Każdy kontekst dotyczący kolumn, które są częścią tabeli, na której zdefiniowano kalendarz, ale które nie są oznaczone w tym kalendarzu, zostaje zachowany.

Uwaga / Notatka

Zalecamy skojarzenie tylko kolumn w kalendarzu, które mają być używane w obliczeniach analizy czasowej.

Kolumny podstawowe i skojarzone

Kolumna podstawowa jest wymagana dla każdej kategorii. Zawsze, gdy ta kolumna lub wszystkie skojarzone kolumny przypisane do tej samej kategorii w odwołanym kalendarzu znajdują się w kontekście lub kategoria jest wymagana do wykonania obliczeń, usługa Power BI używa kolumny podstawowej. Ponadto kolumny podstawowe są używane do sortowania. Jeśli wartości w kolumnie podstawowej nie zezwalają na sortowanie zgodnie z oczekiwaniami, możesz skonfigurować kolumnę podstawową do sortowania według innej kolumny lub użyć innej kolumny i ustawić oryginalną kolumnę jako skojarzona. Na przykład kolumna z danymi tekstowymi zawierającymi numer miesiąca i rok w formacie mm-yyyy (czyli 01-2024, 02-2024i tak dalej) nie będzie poprawnie sortowana w ciągu wielu lat, ale kolumna, która używa yyyy-mm formatu:

Zrzut ekranu przedstawiający dwie tabele. Każda tabela ma jedną kolumnę. Pierwsza tabela zawiera kolumnę zawierającą tekstową liczbę miesięcy i informacje o roku w formacie mm-rrrr, a druga zawiera te same informacje w formacie rrrr-mm. Kolumna zawierająca dane w formacie mm-rrrr nie jest poprawnie posortowana.

Możesz mieć zero lub więcej skojarzonych kolumn przypisanych do kategorii.

Validation

Ważne jest, aby zweryfikować i przetestować kalendarz, aby mieć pewność, że spełnia Twoje potrzeby. Walidacje oferowane w usłudze Power BI obejmują weryfikacje w czasie rzeczywistym i walidacje offline.

Uwaga / Notatka

Kalendarz można zapisać pomimo błędów walidacji trybu offline, ale najpierw zaleca się ich rozwiązanie. Aby móc zapisać, należy naprawić błędy walidacji w czasie rzeczywistym.

Walidacje w czasie rzeczywistym

Walidacje wykonywane w czasie rzeczywistym w kalendarzach to:

  • Unikatowa nazwa kalendarza. Każdy kalendarz musi mieć unikatową nazwę w modelu semantycznym.
  • Pojedyncze skojarzenie na kalendarz. Kolumna nie może należeć do więcej niż jednej kategorii w tym samym kalendarzu.
  • Unikatowość okresu. Przypisane kategorie powinny jednoznacznie identyfikować okres.
  • Spójna kategoryzacja. Gwarantuje to, że kolumny są skojarzone z tą samą kategorią w kalendarzach.

Unikatowość okresu

Zawsze powinna istnieć ścieżka umożliwiająca unikatowe zidentyfikowanie okresu dla przypisanych kategorii.

Za każdym razem, gdy dodasz kategorię częściową, usługa Power BI sprawdza, czy zgodna kombinacja kompletnych lub częściowych kategorii jest również oznaczana w tym samym kalendarzu. Jeśli tak nie jest, zostanie wyświetlone ostrzeżenie.

Zrzut ekranu przedstawiający ekran tworzenia i edytowania kalendarza z błędem walidacji w czasie rzeczywistym.

Na przykład podczas konfigurowania kalendarza dla obliczeń opartych na tygodniu upewnij się, że przypisano co najmniej kolumnę podstawową do jednego z następujących zestawów kategorii:

  • Tydzień
  • Tydzień roku, Rok
  • Tydzień w kwartale, kwartał
  • Tydzień kwartału, kwartał roku, rok
  • Tydzień miesiąca, miesiąc
  • Tydzień miesiąca, miesiąc roku, rok
  • Tydzień miesiąca, miesiąc kwartału, kwartał
  • Tydzień miesiąca, miesiąc kwartału, kwartał roku, rok

Spójna kategoryzacja

Kolumny muszą mieć spójną kategorię w kalendarzach. Nie można przypisać tej samej kolumny do różnych kategorii, takich jak Year, Quarter of Year lub time-related w oddzielnych kalendarzach.

Walidacje offline

Walidacje offline mogą być potencjalnie czasochłonne podczas uzyskiwania dostępu do danych tabeli. W związku z tym nie są one uruchamiane automatycznie w przeciwieństwie do walidacji w czasie rzeczywistym. Aby uruchomić walidacje, wybierz pozycję Zweryfikuj dane:

Zrzut ekranu przedstawiający tworzenie kalendarza i ekran edycji. Przycisk Weryfikuj dane jest wyróżniony.

Walidacje trybu offline weryfikują następujące reguły i zwracają ostrzeżenie, jeśli jakiekolwiek reguły są nieważne w Twoim kalendarzu.

  • kolumna skojarzona z kategorią nie ma pustych wartości.
  • kategorie wyższego poziomu i niższego poziomu mają współczynnik kardynalności jeden do wielu. Na przykład kolumny skojarzone z kategorią "Rok" powinny mieć kardynalność jeden do wielu z kolumnami skojarzonymi z kategorią "Miesiąc".
  • kolumny skojarzone z kategoriami na tym samym poziomie mają współczynnik kardynalności jeden do jednego. Na przykład kolumny skojarzone z kategorią Month (Miesiąc) powinny mieć relacje jeden do jednego z kombinacjami kolumn skojarzonych z kategoriami Month of Year (Miesiąc roku) i Year (Rok).
  • kolumny podstawowe i skojarzone przypisane do tej samej kategorii mają współczynnik kardynalności jeden do jednego. Na przykład po przypisaniu do kategorii Month (Miesiąc) kolumna podstawowa Month (Miesiąc) i skojarzona kolumna EnglishMonthName (Miesiąc) powinna mieć kardynalność "jeden do jednego".

Praca z kalendarzami

Po zdefiniowaniu kalendarza można odwoływać się do niego w funkcjach analizy czasowej. Na przykład, poniższa miara oblicza sumę całkowitej ilości od początku miesiąca do dnia dzisiejszego według kalendarza ISO-454.

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

Jeśli kalendarz nie jest zdefiniowany i zwracany jest błąd:

Zrzut ekranu przedstawiający miarę korzystającą z TOTALMTD funkcji za pomocą parametru kalendarza prowadzącego do nieistniejącego kalendarza.

Nawet jeśli kalendarz jest zdefiniowany, miara może nadal zwracać błąd. Dzieje się tak, jeśli użyta funkcja oczekuje, że kategoria będzie obecna w kalendarzu, a kalendarz nie ma tej kategorii. Na przykład TOTALWTD oczekuje, że określone kategorie będą obecne w kalendarzu. Jeśli nie są, zostanie zwrócony błąd:

Zrzut ekranu przedstawiający miarę przy użyciu funkcji TOTALWTD z prawidłowym odwołaniem do kalendarza, które nie definiuje wymaganych kategorii.

Funkcje analizy czasowej i wymagane kategorie

Wiele funkcji analizy czasowej wymaga wystarczających kategorii, które należy uwzględnić w kalendarzu, do którego odwołuje się wywołanie funkcji, aby usługa Power BI mogła zidentyfikować unikatowo konkretną jednostkę czasu. Innymi słowy, usługa Power BI musi być w stanie "przenieść się" z poziomu, na którym wykonywane są obliczenia, aż do pojedynczego roku. Na przykład podczas wykonywania obliczeń w kwartałach przy użyciu TOTALQTD, przypisz kategorię Kwartał lub przypisz zarówno Kwartał Roku, jak i Rok w kalendarzu, jak określono przez walidację unikatowości Okresu.

Uwaga / Notatka

W przypadku niektórych funkcji ich nazwa wskazuje, który poziom obliczeń działa (na przykład TOTALYTD), podczas gdy dla innych zależy od parametrów i kontekstu (na przykład DATEADD).

Czyszczenie kontekstu

Funkcje analizy czasowej działają, zaczynając od punktu w czasie, a następnie wykonując na nim operację w celu uzyskania innego punktu w czasie. Oczywiście początkowy punkt w czasie może kolidować z tym wynikiem, co sprawia, że przecięcie kontekstu filtru domyślnie generuje częściowe lub puste wyniki. Rozważmy na przykład następujący scenariusz.

Definicja kalendarza

Mamy prosty kalendarz gregoriański, który oznacza trzy kategorie zdefiniowane jako:

Kategoria Kolumna podstawowa
Rok Rok
Miesiąc roku MiesiącRoku
Kwartał Kwartał

Definicje miar

Zdefiniowano dwie podstawowe miary: jedną, aby obliczyć łączną sprzedaż, a drugą w celu obliczenia całkowitej sprzedaży z poprzedniego kwartału:

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

Przykład: jak działa czyszczenie kontekstu

Nasza wizualizacja tabeli wyświetlana jest z dokładnością do miesięcy, korzystając z kolumn Year i MonthOfYear.

Rok MiesiącRoku Łączna sprzedaż Sprzedaż za Ostatni Kwartał
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

W tej tabeli pogrubiony wiersz przedstawia dane na poziomie miesiąca, dla kwietnia 2011 r. W związku z tym wszystkie miary w tym wierszu będą oceniane w kontekście filtru [Year] == 2011 i [MonthOfYear] == 4.
Zgodnie z oczekiwaniami, TotalSales została obliczona jako łączna sprzedaż za kwiecień 2011 roku.

LastQuarterSales analogicznie oblicza TotalSales, ale z uwzględnieniem dodatkowego filtru dostarczonego przez funkcję opartą na kalendarzu DATEADD. W tym wierszu DATEADD byłby początkowy punkt w czasie kwietnia 2011 r. i dałby punkt w czasie, odpowiadający dokładnie jednemu kwartałowi wcześniej: styczeń 2011 r. W związku z tym można oczekiwać, że ta wartość TotalSales zostanie obliczona w następujących dwóch kontekstach filtru:

  • Udostępnione przez kolumny nawigacyjne bieżącego wiersza: { [Year] == 2011, [MonthOfYear] == 4 } (równoważne kwiecień 2011)
  • Podany przez DATEADD filtr: { [Year] == 2011, [MonthOfYear] == 1 } (równoważne, styczeń 2011 r.)

Oczywiście te dwa konteksty filtru powodują konflikt — nie możemy ocenić całkowitej sprzedaży podanej w bieżącym miesiącu zarówno w styczniu 2011 , jak i kwietniu 2011 r. Takie skrzyżowanie nie przyniosłoby żadnych wyników. Nie jest to jednak to, co się dzieje. Zamiast tego na podstawie definicji kalendarza funkcje analizy czasowej oparte na kalendarzu identyfikują kolumny kategorii, które mogą powodować konflikty, po operacji czasu wykonywanej przez funkcję. W takim przypadku DATEADD wykonuje zmianę na poziomie Kwartał . Funkcja określa, że zarówno kategorie Year i Month of Year mogą ulec zmianie w wyniku zmiany w kolumnach kategorii Kwartał . W związku z tym funkcja czyści kontekst filtru dla wszystkich kolumn (zarówno podstawowych, jak i skojarzonych), które są oznaczone tymi kategoriami.

Innymi słowy, możemy powiedzieć, że kategorie Year i Month of Year są zależnościami kategorii Kwartał . Z drugiej strony możemy powiedzieć, że kategoria Quarter jest zależna od kategorii Year (Rok) i Month of Year (Miesiąc roku).

Jak działa czyszczenie kontekstu

Diagram struktury kratownicowej wszystkich kategorii kalendarzy.

Ten diagram umożliwia lepszą wizualizację zależności między różnymi kategoriami czasu. Każda kategoria w tej kratce reprezentuje wszystkie kolumny (podstawowe i skojarzone) oznaczone do tej kategorii. Kategorie są połączone ze swoimi zależnościami za pomocą strzałek. Na przykład "Miesiąc" jest zależny od "Rok", "Kwartał roku", "Miesiąc kwartału", "Kwartał" i "Miesiąc roku".

Gdy kontekst jest ustawiony na kolumnie lub jej skojarzonym sortowaniu według kolumny oznaczonej w kalendarzu, poprzedni kontekst filtru jest czyszczony w:

  1. Wszystkie zależności kategorii X. Można to traktować jako wszystkie kategorie powyżej X.
  2. Wszystkie elementy zależne od kategorii X i jego zależności (czyli od 1. powyżej). Można to traktować jako wszystkie kategorie poniżej X i wszystkie kategorie w 1 powyżej.

Uwaga / Notatka

Czyszczenie kontekstu odbywa się na kolumnach oznaczonych w kalendarzu lub skojarzonych kolumnach sortowania , niezależnie od tego, czy kontekst jest ustawiony przy użyciu funkcji analizy czasowej lub w inny sposób.

Większość funkcji analizy czasowej, z wyjątkiem DATEADD i SAMEPERIODLASTYEAR, spowoduje wyczyszczenie kontekstu dla wszystkich kolumn związanych z czasem i skojarzonych kolumn sortowania.

Zachowanie między kalendarzami

Jeśli w tej samej tabeli zdefiniowano wiele kalendarzy, te procesy są wykonywane dla każdego kalendarza zdefiniowanego w tabeli. Obejmuje to uwagi dotyczące czyszczenia kontekstu kolumn związanych z czasem. Innymi słowy, załóżmy, że tabela definiuje trzy kalendarze: Kalendarz1, Kalendarz2 i Kalendarz3. Jeśli kontekst filtru jest ustawiony na kategorię "X" w kalendarzu Calendar1, powyższe procesy są wykonywane we wszystkich trzech kalendarzach.

Przykład: filtr ustawiony na "Kwartał"

Jeśli kontekst filtru został ustawiony w kategorii "Kwartał", proces będzie następujący.

  1. Najpierw rozważone zostałyby wszystkie zależności kategorii "Kwartał".

    Przykład zachowania czyszczenia kontekstu filtru, zaczynający się od kategorii Kwartał: powiązania.

  2. Następnie należy rozważyć wszystkich zależnych od "Kwartał" oraz jego zależności.

    Przykład zachowania czyszczenia kontekstu filtru rozpoczynający się od kategorii Kwartał: zależne.

  3. Na koniec wynik końcowy będzie następujący. Wszystkie czerwone kategorie będą miały usunięty poprzedni kontekst filtru, a nowy kontekst jest ustawiony na kwartał.

    Przykład zachowania czyszczenia kontekstu filtru rozpoczynający się od kategorii Kwartał: Wyniki

Skrypt TMDL dla kalendarzy

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

Uwaga / Notatka

Zwróć uwagę, że jeśli nie określisz żadnej kategorii w calendarColumnGroup języku TMDL, kolumny zostaną oznaczone jako związane z czasem. W tym przykładzie Holiday Name i isWorkingDay to kolumny związane z czasem w Kalendarzu Pokazowym.

Umieść to wszystko razem: Przykłady przesunięcia czasu

Niektóre funkcje analizy czasowej zmieniają kontekst tylko bocznie, biorąc pod uwagę wszystkie kolumny, podczas gdy inne wykonują zmiany hierarchiczne — zachowując lub usuwając kontekst na podstawie tego, czy kolumny są otagowane w kalendarzu. Funkcje analizy czasowej można podzielić na dwie grupy na podstawie tego, czy umożliwiają one zmiany hierarchiczne:

  • Naprawiono. Funkcje w tej grupie to DATEADD i SAMEPERIODLASTYEAR. Te funkcje umożliwiają tylko przesunięcia czasowe w poziomie i nie zwracają wartości z innego poziomu szczegółowości danych.
  • Elastyczne. Ta grupa zawiera wszystkie inne funkcje analizy czasowej. Te funkcje umożliwiają hierarchiczne zmiany czasu i w zależności od konfiguracji kalendarza mogą zwracać wyniki z innego poziomu szczegółowości.

Aby pokazać te zachowania, przyjrzyjmy się przykładowi za pomocą prostego modelu danych składającego się z dwóch tabel, dwóch kalendarzy i pięciu miar.

Tabele i relacje

W tym przykładzie mamy następujący prosty model danych:

Tabela Kolumny
Date Rok, CzyDzieńRoboczy, Data
Sales Klucz zamówienia, Ilość, Data zamówienia

Oto kilka przykładów wierszy w tabeli Date (Data ): Zrzut ekranu przedstawiający pierwsze 14 wierszy przykładowej tabeli Date (Data). Tabela definiuje datę, rok i isWorkingDay. Kolumna Date zawiera datę, kolumnę Year (Rok) wartość roku, a kolumna IsWorkingDay jest kolumną logiczną (True/False), która wskazuje, czy data jest dniem roboczym, czy nie.

Oto kilka przykładowych wierszy w tabeli Sales : Zrzut ekranu przedstawiający pierwsze dziewięć wierszy przykładowej tabeli Sales. Tabela definiuje wartość OrderKey, OrderDate i Order Quantity. Kolumna OrderKey zawiera unikatową liczbę dla każdego zamówienia sprzedaży. Data zamówienia jest datą, która odnosi się do daty, a Order Quantity to kolumna liczbowa reprezentująca liczbę produktów dla każdego zamówienia.

Tabele Sales i Date są powiązane z tabelami OrderDate i Date.

Zrzut ekranu przedstawiający widok modelu dla przykładowego modelu. Pokazuje tabele

Calendars

W tabeli Date zdefiniowaliśmy kalendarze z następującymi mapowaniami:

NazwaKalendarza Kategoria Kolumna podstawowa
Gregoriański Rok Rok
Date Date
GregorianWithWorkingDay Rok Rok
Date Date
Związane z czasem IsWorkingDay

Równoważna definicja języka TMDL tych dwóch kalendarzy to:

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   

Środki

W tabeli Sales (Sprzedaż ) definiujemy następujące miary:

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

Przykład zmiany bocznej

Utwórzmy wizualizację przedstawiającą wartości Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity i OneYearAgoQuantityTimeRelated w latach 2024 i 2025:

Zrzut ekranu przedstawiający wizualizację tabeli przedstawiającą rok, IsWorkingDay, Total Quantity, OneYearAgoQuantity i OneYearAgoQuantityTimeRelated. Wartości oneYearAgoQuantity i OneYearAgoQuantityTimeRelated dla 2025 r. są zgodne z wartościami dla 2024 dla tych samych wartości IsWorkingDay.

Wszystkie wartości dla OneYearAgoQuantity i OneYearAgoQuantityTimeRelated dla roku 2025 są zgodne z wartością Total Quantity dokładnie sprzed roku (2024) dla tej samej wartości IsWorkingDay.

To pokazuje, że DATEADD utrzymuje kontekst w każdej kolumnie tabeli Date, która zawiera używany kalendarz, niezależnie od tego, czy nie jest oznaczona, czy oznaczona jako powiązana z czasem w tym kalendarzu. Ponieważ w definicjach miar poinstruowaliśmy DATEADD , aby cofnąć się o jeden rok, jedyną kolumną, której kontekst został przesunięty, była kolumna skojarzona z kategorią Year. Niezależnie od tego, czy kolumna IsWorkingDay była oznaczona w kalendarzu jako powiązana z czasem, czy nie była oznaczona wcale, wynik się nie zmienił. Jedyną inną funkcją, która wykazuje to zachowanie, jest SAMEPERIODLASTYEAR.

Przykład zmiany hierarchicznej

Teraz przyjrzyjmy się przykładowi, w którym to, czy kolumna jest oznaczona jako powiązana z czasem, faktycznie zmienia wynik.

W tym celu ponownie utworzymy tę samą wizualizację, co w poprzednim przykładzie, ale tym razem użyjemy miar FullLastYearQuantity i FullLastYearQuantityTimeRelated: zrzut ekranu przedstawiający wizualizację tabeli, która pokazuje kolumny Year, IsWorkingDay, Total Quantity, FullLastYearQuantity i FullLastYearQuantityTimeRelated. Wartości miary FullLastYearQuantity dla roku 2025 odpowiadają wartościom z 2024 dla tych samych wartości IsWorkingDay, ale wartości miary FullLastYearQuantityTimeRelated są równe wartości Total Quantity niezależnie od wartości IsWorkingDay.

Pokazuje to, że PARALLELPERIOD zachowuje kontekst kolumn nieoznaczonych w kalendarzu, ale czyści kontekst dla tych oznaczonych jako związane z czasem. FullLastYearQuantity używało kalendarza gregoriańskiego , w którym element IsWorkingDay nie został oznaczony w kalendarzu, podczas gdy fullLastYearQuantityTimeRelated użył kalendarza GregorianWithWorkingDay , w którym element IsWorkingDay został oznaczony jako powiązany z czasem. Wszystkie funkcje analizy czasowej z wyjątkiem DATEADD i SAMEPERIODLASTYEAR zachowują się w ten sposób.

Bonus: Jeśli naprawdę chcesz wymusić te funkcje, aby zachować kontekst dla kolumn związanych z czasem, możesz również użyć polecenia VALUES:

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

W takim przypadku FullLastYearQuantityTimeRelatedOverride zwraca te same wyniki co FullLastYearQuantity.

Podsumowanie

W powyższym przedstawionym przykładzie pokazano, że różne funkcje analizy czasowej zachowują się inaczej w zależności od tego, czy kolumny są oznaczone jako związane z czasem w kalendarzu. DATEADD i SAMEPERIODLASTYEAR wykonują tylko boczne przesunięcia czasowe. Wszystkie inne funkcje analizy czasowej umożliwiają hierarchiczne zmiany czasu.

Użyj DATEADD z kalendarzami

Funkcja DATEADD ma określone parametry, które umożliwiają precyzyjną kontrolę nad sposobem wykonywania przesunięć, gdy wybór jest na bardziej szczegółowym poziomie niż poziom przesunięcia wskazywany przez interval parametr w .DATEADD Dzieje się tak na przykład w przypadku wyświetlania danych na poziomie daty, ale dla parametru interval ustaw wartość DATEADDMONTH. Na przykład w kalendarzu gregoriańskim przesunięcie okresu obejmującego 3 marca do 10 marca o miesiąc spowoduje, że będzie to od 3 kwietnia do 10 kwietnia. Jednak ze względu na to, że miesiące w kalendarzach gregoriańskich różnią się długością, może to prowadzić do niejednoznaczności podczas zmiany. Poniżej przedstawiono przykładowe scenariusze oparte na kalendarzu gregoriańskim:

Przesunięcie z krótszego do dłuższego okresu

Na przykład przesunięcie do przodu jeden miesiąc z wyborem w lutym, więc docelowy miesiąc to marzec. Możesz użyć parametru extension , aby wpłynąć na sposób wykonywania przesunięcia:

Wartość parametru rozszerzenia Description Wynik
precise Dzięki temu oryginalny zakres dat jest ściśle zachowany. 25-28 lutego jest przesunięty do 25-28 marca.
extended Umożliwia rozwinięcie okna w kierunku końca miesiąca. 25-28 lutego jest przesunięty do 25-31 marca.

Przesunięcie z dłuższego do krótszego okresu

Na przykład cofnięcie o jeden miesiąc wstecz przy wyborze w marcu, więc miesiącem docelowym jest luty.

Możesz użyć parametru truncation , aby wpłynąć na sposób wykonywania przesunięcia:

Obcięcie wartości parametru Description Wynik
anchored Zakotwiczy wynik do ostatniej prawidłowej daty mniejszego miesiąca. 31 marca jest przesunięty do 28 lutego (lub 29 w roku przestępnym).
blank Gdy data przesunięta nie istnieje, zwróć wartość pustą. Przesunięcie 31 marca o jeden miesiąc wstecz zwraca pustą (ponieważ 31 lutego nie istnieje).

Zagadnienia dotyczące pracy z analizą czasową opartą na kalendarzu

  • Wykonywanie obliczeń analizy czasowej w tabeli faktów, która definiuje kalendarz i podlega regułom zabezpieczeń na poziomie wiersza (RLS), może prowadzić do nieoczekiwanych wyników.
  • Wydajność tej funkcji w wersji zapoznawczej nie jest reprezentatywna dla produktu końcowego.
  • Nie możesz jeszcze tworzyć kalendarzy w usłudze Power BI.
  • Nie należy używać tabel automatycznego datowania/czasu w połączeniu z niestandardowymi kalendarzami.
  • Nie można używać kalendarzy z modelami połączonymi na żywo ani modelami złożonymi.
  • Zalecamy skojarzenie tylko kolumn w kalendarzu, które mają być używane w obliczeniach analizy czasowej.
  • Kalendarze podlegają weryfikacji w czasie rzeczywistym i offline . Kalendarz można zapisać pomimo błędów walidacji trybu offline, ale najpierw zaleca się ich rozwiązanie. Aby móc zapisać, należy naprawić błędy walidacji w czasie rzeczywistym.
  • Każdy kalendarz musi mieć unikatową nazwę w modelu danych
  • Pojedyncza tabela może zawierać wiele kalendarzy
  • Tabela zawierająca kalendarz musi zawierać mniej niż 200 kolumn. Jeśli tabela zawiera więcej niż 20 000 wierszy, walidacje nie będą dostępne, ale nadal można dodać kalendarz.
  • Kalendarz musi przypisać co najmniej jedną kolumnę podstawową do kategorii
  • Kalendarz może przypisywać tylko kolumny z własnej tabeli do kategorii
  • Każda kategoria powinna mieć kolumnę podstawową i może mieć przypisane zero lub więcej skojarzonych kolumn
  • DATEADD Ma nowe parametry do kontrolowania zachowania rozszerzeń, które nie są rozpoznawane w funkcji IntelliSense.
  • Dowolna dana kolumna może być mapowana tylko na jedną kategorię
  • Nie można zagnieżdżać funkcji analizy czasowej, które używają kalendarzy. Na przykład następująca instrukcja języka DAX nie jest obsługiwana:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Zamiast tego możesz wykonać następujące czynności:

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

Tworzenie tabeli dat przy użyciu wbudowanych narzędzi

W poniższych przykładach utworzono tabelę dat z 1 stycznia 2010 r. do 31 grudnia 2030 r. przy użyciu dodatku Power Query M lub języka DAX. Zawiera następujące kolumny: Rok, Numer miesiąca, Nazwa miesiąca, Rok miesiąca, Kwartał, Kwartał roku, Dzień i Data.

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

Aby uzyskać więcej informacji i więcej opcji, zobacz Tabele dat.

Aby uzyskać więcej informacji związanych z tym artykułem, zobacz następujące zasoby: