Dodatkowe obliczenia analizy czasowej
Istnieją inne funkcje analizy czasowej języka DAX, których zadaniem jest zwracanie pojedynczej daty. Poznasz te funkcje, stosując je w dwóch różnych scenariuszach.
FIRSTDATE
Funkcje i LASTDATE
języka DAX zwracają pierwszą i ostatnią datę w bieżącym kontekście filtru dla określonej kolumny dat.
Liczenie nowych wystąpień
Innym zastosowaniem funkcji analizy czasowej jest liczenie nowych wystąpień. Poniższy przykład pokazuje, jak można obliczyć liczbę nowych klientów w danym okresie. Nowy klient jest liczony w okresie, w którym dokonał swojego pierwszego zakupu.
Pierwszym zadaniem jest dodanie następującej miary do tabeli Sales (Sales ), która zlicza liczbę odrębnych klientów do daty (LTD). Okres od początku do daty oznacza czas od rozpoczęcia do ostatniej daty w kontekście filtru. Sformatuj miarę jako liczbę całkowitą przy użyciu separatora tysięcy.
Customers LTD =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD
Dodaj miarę Customers LTD do wizualizacji macierzy. Zwróć uwagę na to, że wygeneruje wynik unikatowych klientów LTD do końca każdego miesiąca.
Funkcja DATESBETWEEN
zwraca tabelę zawierającą kolumnę dat rozpoczynającą się od danej daty rozpoczęcia i trwa do określonej daty zakończenia. Gdy data rozpoczęcia jest pusta, funkcja użyje pierwszej daty z kolumny dat (natomiast gdy data zakończenia jest pusta, zostanie użyta ostatnia data w kolumnie dat). W takim przypadku data zakończenia jest określana przez funkcję MAX, która zwraca ostatnią datę w kontekście filtru. W związku z tym, jeśli miesiąc sierpnia 2017 r. jest w kontekście filtru, funkcja MAX zwróci 31 sierpnia 2017 r., a DATESBETWEEN
funkcja zwróci wszystkie daty do 31 sierpnia 2017 r.
Następnie zmodyfikujesz miarę, zmieniając jej nazwę na New Customers i dodając drugą zmienną do przechowywania liczby unikatowych klientów przed upływem czasu w kontekście filtru. Klauzula RETURN
odejmuje teraz tę wartość od klientów LTD, aby wygenerować wynik, czyli liczbę nowych klientów w okresie.
New Customers =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
VAR CustomersPrior =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MIN('Date'[Date]) - 1
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD - CustomersPrior
W przypadku zmiennej CustomersPrior zwróć uwagę, że DATESBETWEEN
funkcja zawiera daty do pierwszej daty w kontekście filtru minus jeden. Ponieważ usługa Microsoft Power BI wewnętrznie przechowuje daty jako liczby, możesz dodawać lub odejmować liczby w celu zmiany daty.
Obliczenia migawek
Czasami dane faktów są przechowywane jako migawki w czasie. Typowe przykłady obejmują poziomy zapasów magazynowych lub salda kont. Migawka wartości jest ładowana do tabeli w regularnych odstępach czasu.
Podczas podsumowywania wartości migawek (na przykład poziomów zapasów magazynowych) możesz podsumować wartości z dowolnego wymiaru z wyjątkiem daty. Dodanie liczby poziomów zapasów w różnych kategoriach produktów pozwala uzyskać wartościowe podsumowanie, ale dodawanie liczby poziomów zapasów w różnych datach nie jest dozwolone. Dodanie wczorajszego poziomu zapasów do poziomu bieżącego nie jest użyteczną operacją (chyba że chcemy obliczyć średni wynik).
Podczas podsumowywania tabel migawek formuły miar mogą polegać na funkcjach analizy czasowej języka DAX, aby wymusić pojedynczy filtr daty.
W poniższym przykładzie przedstawiono scenariusz firmy Adventure Works. Przejdź do widoku modelu i wybierz diagram modelu Inventory.
Zwróć uwagę, że na diagramie przedstawiono trzy tabele: Product( Produkt), Date (Data) i Inventory (Spis). Tabela Inventory przechowuje migawki sald jednostkowych dla każdej daty i produktu. Co ważne, tabela ta nie zawiera żadnych brakujących dat ani zduplikowanych wpisów dla żadnego produktu z tą samą datą. Ponadto ostatni przechowywany rekord migawki jest z dnia 15 czerwca 2020 r.
Teraz przejdź do widoku raportu i wybierz stronę 2 raportu. Dodaj kolumnę UnitsBalance tabeli Inventory do wizualizacji macierzy. Jej domyślne podsumowanie jest ustawione na wartość sum.
Ta konfiguracja wizualizacji jest przykładem sposobu, w jaki nie należy podsumowywać wartości migawki. Dodawanie do siebie dziennych sald migawek nie tworzy znaczącego wyniku. W związku z tym usuń pole UnitsBalance z wizualizacji macierzy.
Teraz dodasz miarę do tabeli Inventory , która sumuje wartość UnitsBalancedla pojedynczej daty. Data będzie datą końcową każdego okresu. Jest osiągana przy użyciu LASTDATE
funkcji . Sformatuj miarę jako liczbę całkowitą przy użyciu separatora tysięcy.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
Uwaga
Zwróć uwagę, że formuła SUM
miary używa funkcji. Należy użyć funkcji agregującej (miary nie zezwalają na bezpośrednie odwołania do kolumn), ale biorąc pod uwagę, że dla każdego produktu istnieje tylko jeden wiersz dla każdego produktu SUM
, funkcja będzie działać tylko w jednym wierszu.
Dodaj do wizualizacji macierzy miarę Stock on Hand. Wartość dla każdego produktu jest teraz oparta na ostatnim zarejestrowanym saldzie jednostkowym w przypadku każdego miesiąca.
Miara zwraca puste wartości dla kolumny June 2020, ponieważ nie ma żadnego rekordu dla ostatniej daty z czerwca. Zgodnie z danymi miesiąc ten jeszcze się nie rozpoczął.
Filtrowanie według ostatniej daty w kontekście filtru wiąże się z następującymi problemami: Zarejestrowana data może nie istnieć, ponieważ jeszcze nie wystąpiła lub prawdopodobnie salda zapasów nie są rejestrowane w weekendy.
Następnym krokiem jest dostosowanie formuły miary w celu określenia ostatniej daty bezpustego wyniku, a następnie filtrowanie według tej daty. To zadanie można osiągnąć przy użyciu LASTNONBLANK
funkcji języka DAX.
Użyj następującej definicji miary, aby zmodyfikować miarę Stock on Hand.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
W wizualizacji macierzy zwróć uwagę na wartości kolumn June 2020 i Total (reprezentującej cały rok).
Funkcja LASTNONBLANK
jest iteratorem. Zwraca ostatnią datę z uzupełnionym wynikiem. Uzyskuje ten wynik poprzez iterowanie wszystkich dat w kontekście filtru w malejącej kolejności chronologicznej (Z drugiej strony iteruje FIRSTNONBLANK
w kolejności chronologicznej rosnącej). Dla każdej daty oblicza przekazaną wyrażeniu. Gdy napotka uzupełniony wynik, zwróci datę. Ta data jest następnie używana do filtrowania CALCULATE
funkcji.
Uwaga
Funkcja LASTNONBLANK
oblicza wyrażenie w kontekście wiersza. Funkcja CALCULATE
musi służyć do przejścia kontekstu wiersza do kontekstu filtru w celu poprawnej oceny wyrażenia.
Ukryj w tabeli Inventory kolumnę UnitsBalance. Uniemożliwi to autorom raportów niewłaściwe podsumowywanie migawek sald jednostkowych.