Ytterligare tidsinformationsberäkningar

Slutförd

Det finns andra tidsinformationsfunktioner i DAX som används för att returnera ett enstaka datum. Du får lära dig mer om dessa funktioner genom att använda dem i två olika scenarier.

FIRSTDATE DAX-funktionerna och LASTDATE returnerar det första och sista datumet i den aktuella filterkontexten för den angivna kolumnen med datum.

Beräkna nya förekomster

Tidsinformationsfunktioner kan även användas för att räkna nya förekomster. Följande exempel visar hur du kan beräkna antalet nya kunder för en tidsperiod. En ny kund räknas i den tidsperiod då kunden gjorde sitt första köp.

Din första uppgift är att lägga till följande mått i tabellen Sales som räknar antalet distinkta kunder hittills i livet (LTD). Hittills från start, eller LTD (Life-To-Date), avser tidsperioden från start till det sista datumet i filterkontexten. Använd tusentalsavgränsaren och formatera måttet som ett heltal.

Customers LTD =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD

Lägg till måttet Customers LTD (Kunder hittills från start) till matrisvisualiseringen. Som du ser returneras unika kunder från start till slutet av varje månad.

Funktionen DATESBETWEEN returnerar en tabell som innehåller en kolumn med datum som börjar med ett angivet startdatum och fortsätter till ett angivet slutdatum. Om startdatumet är tomt används det första datumet i datumkolumnen. (Och på motsvarande sätt används det sista datumet i datumkolumnen om slutdatumet är tomt.) I det här fallet bestäms slutdatumet av funktionen MAX, som returnerar det sista datumet i filterkontexten. Om augusti 2017 är i filterkontext returnerar därför funktionen MAX den 31 augusti 2017 och funktionen returnerar alla datum till och med den DATESBETWEEN 31 augusti 2017.

Nu ska du ändra måttet genom att byta namn på det till New Customers (Nya kunder) och genom att lägga till en andra variabel som ska lagra antalet unika kunder före tidsperioden i filterkontexten. Satsen RETURN subtraherar nu det här värdet från LTD-kunder för att skapa ett resultat, vilket är antalet nya kunder under tidsperioden.

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

Observera att DATESBETWEEN funktionen innehåller datum fram till det första datumet i filterkontexten minus ett för variabeln CustomersPrior. Eftersom Microsoft Power BI lagrar datum som tal internt, kan du lägga till eller subtrahera tal för att byta datum.

Beräkningar med ögonblicksbilder

Ibland lagras fakta som ögonblicksbilder i tid. Vanliga exempel är lagernivåer och kontosaldon. En ögonblicksbild av värden läses in i tabellen med jämna mellanrum.

När du summerar ögonblicksbildsvärden (t.ex. lagernivåer) kan du summera värden över valfri dimension förutom datum. Genom att addera lagernivåer för olika produktkategorier kan du skapa en användbar summering, vilket inte är fallet med lagernivåer över datum. Det är inte särskilt meningsfullt att summera gårdagens lagernivå med dagens lagernivå (såvida du inte vill beräkna medelvärdet av resultatet).

När du summerar tabeller med ögonblicksbilder kan måttformler använda DAX-tidsinformationsfunktioner för att tillämpa ett enskilt datumfilter.

I följande exempel ska du utforska ett scenario för företaget Adventure Works. Växla till modellvyn och välj modelldiagrammet Inventory (Lager).

Observera att diagrammet visar tre tabeller: Produkt, Datum och Inventering. Tabellen Inventory lagrar ögonblicksbilder av enhetssaldon för varje datum och produkt. Det är viktigt att inga datum saknas i tabellen och att den inte innehåller några dubblettposter för produkter på samma datum. Och den sista ögonblicksbildsposten lagras för den 15 juni 2020.

Byt till rapportvyn och välj sida 2 i rapporten. Lägg till kolumnen UnitsBalance i tabellen Inventory i det visuella matrisobjektet. Standardsummeringen är inställd på summeringsvärden.

Den här visuella konfigurationen är ett exempel på hur du inte ska summera ett ögonblicksbildsvärde. Att summera dagliga ögonblicksbildssaldon ger inget meningsfullt resultat. Ta därför bort fältet UnitsBalance från matrisvisualiseringen.

Nu ska du lägga till ett mått i tabellen Inventory som summerar värdet UnitsBalanceför ett enda datum. Datumet är det sista datumet i varje tidsperiod. Det uppnås med hjälp LASTDATE av funktionen . Använd tusentalsavgränsaren och formatera måttet som ett heltal.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTDATE('Date'[Date])
)

Anteckning

Observera att måttformeln använder SUM funktionen. En mängdfunktion måste användas (mått tillåter inte direkta referenser till kolumner), men med tanke på att det bara finns en rad för varje produkt för varje datum SUM , kommer funktionen endast att fungera över en enda rad.

Lägg till måttet Stock on Hand (Tillgängligt lager) till matrisvisualiseringen. Nu baseras värdet för varje produkt på det sista registrerade enhetssaldot för respektive månad.

Måttet returnerar tomma värden för juni 2020 eftersom det inte finns någon post för det sista datumet i juni. Ur dataperspektiv har det inte inträffat än.

Det är problematiskt att filtrera efter det sista datumet i filterkontexten: Det kanske inte finns något registrerat datum eftersom det inte har inträffat än, eller kanske på grund av att lagersaldon inte registreras på helger.

Nästa steg är att justera måttformeln för att fastställa det sista datum som har ett resultat som inte är tomt och sedan filtrera baserat på det datumet. Du kan uppnå den här uppgiften med hjälp LASTNONBLANK av DAX-funktionen.

Använd följande måttdefinition för att ändra måttet Stock on Hand (Tillgängligt lager).

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTNONBLANK(
        'Date'[Date],
        CALCULATE(SUM(Inventory[UnitsBalance]))
    )
)

Notera värdena för juni 2020 och totalsumman (som representerar hela året) i matrisvisualiseringen.

Funktionen LASTNONBLANK är en iteratorfunktion. Den returnerar det sista datumet som returnerar ett resultat som inte är tomt. Funktionen gör det genom att iterera genom alla datum i filterkontexten i fallande kronologisk ordning. (Omvänt FIRSTNONBLANK itererar itererar i stigande kronologisk ordning.) För varje datum utvärderas det skickade uttrycket. När ett resultat som inte är tomt påträffas, returneras datumet. Det datumet används sedan för att filtrera CALCULATE funktionen.

Anteckning

Funktionen LASTNONBLANK utvärderar dess uttryck i radkontext. Funktionen CALCULATE måste användas för att överföra radkontexten för att filtrera kontexten för att utvärdera uttrycket korrekt.

Nu bör du dölja kolumnen UnitsBalance i tabellen Inventory (Lager). Genom att göra det förhindrar du att rapportförfattare summerar enhetssaldon med ögonblicksbilder på fel sätt.