Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

I det här blogginlägget kommer vi att ta itu med några besvärliga problem med tidsintelligens, särskilt de problem som orsakas av veckas granularitet och de problem som kan orsakas av det oregelbundna antalet veckor på ett år. Vi kommer att använda offset för att komma fram till exakt tidsintelligens i DAX.

Vi har ett intressant scenario för dig idag. Detta kom upp ett par gånger nyligen i LuckyTemplates-forumet. Vad folk ville göra var att ta en bild (som kan vara ett linjediagram eller ett stapeldiagram) och variera det dynamiskt på startdatumet. Du kan se hela videon av denna handledning längst ner på den här bloggen.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

I det här fallet använde vi samma datauppsättning som vi arbetade för det genomsnittliga spotpriset per fat olja . Istället för att bara alltid börja från början i januari ville vi kunna klicka på det visuella, ändra det till ett annat startdatum, men alltid visa ett års data.

Innehållsförteckning

Exempelscenarier av tidsintelligens i DAX

Det finns ett antal anledningar till varför du kanske vill använda den här tekniken. Du kan använda detta om du har ett mått som ständigt justeras i termer av hur det beräknas. Du kanske bara vill visa data från perioden för omjusteringen framåt.

En annan anledning att använda detta är om du vill visualisera detta på ett animerat sätt. Detta kommer i princip att ta din data och visa den dynamiskt när du klickar på spelåtkomsten.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

I den här bilden kan vi ändra startdatumet månad för månad för att visa hur det förändras under en 12-månadersperiod över tid. Detta är en intressant och användbar bild för olika affärsfall, men teoretiskt sett representerar den också ett antal nyckelfrågor relaterade till DAX och datamodellering.

Låt oss gå till LuckyTemplates och titta på vår datamodell först. Detta är en riktigt enkel datamodell med en utökad datumtabell och en spotpristabell kopplad till datumen.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Använda förskjutningar för tidsintelligens i DAX

En av de saker vi kommer att arbeta med är offset . Offseten i den utökade datumtabellen beräknas dynamiskt. Varje gång rapporten antingen uppdateras eller öppnas går den igenom M-koden. Till exempel i en månadsförskjutning tilldelar den den aktuella månaden med 0, föregående månad med -1 och två månader tillbaka med -2. Ser vi framåt i framtiden tilldelar den nästa månad +1 och för två månader i framtiden +2.

Det här är ett enkelt koncept men otroligt kraftfullt när du arbetar med tidsintelligens i DAX och arbetar med månader , kvartal och veckor . Om du inte använder en offset skapar det en hel del komplexitet ibland i dina beräkningar.

Att använda förskjutningar innebär att man använder en kontinuerlig serie av siffror där att gå tillbaka en månad alltid är -1 och framåt en månad alltid är +1 oavsett var på året man befinner sig.

Implementering av Rubber Duck-strategin för tidsintelligens i DAX

Tidigare har jag pratat om rubber ducking , som är att uttrycka din strategi högt innan du börjar skriva din DAX.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Jag funderar högt på hur jag ska hantera detta utifrån ett månatligt sammanhang med hjälp av tidsintelligens i DAX. Jag skulle börja något baserat på det år och den valda månaden och välja de som använder en frånkopplad tabell, för om du tänker på det kommer vartannat val att innebära att år korsas (med undantag för januari).

Låt oss säga att vi vill ha 12 månader från mars, vi kommer att ha minst två månader under det efterföljande året. Om vi ​​använder en ansluten slicer kan vi bara filtrera för det året och kommer inte att kunna filtrera till nästa år.

Skörda förskjutningarna från startdatumet

Låt oss göra detta med en sammankopplad tabell för både månaden och året. Först måste vi skörda den första offset som handlar om startdatumet.

Och sedan vill vi flytta fram den offseten med 12 månader, och sedan bara titta på de datum som ligger inom den uppsättningen offset. Låt mig visa dig hur det ser ut i DAX.

Beräknar det månatliga intervallet

Detta är vårt mått för Inom Range Monthly , där vi väljer vårt år (som vi skördade från den frånkopplade årstabellen) och vår månad (som vi skördade från den frånkopplade månadstabellen).

Vi har också den här andra parametern där om det inte görs något val, kommer den som standard till januari. Denna parameter är i första hand endast för felsökningsändamål.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Beräkna start- och slutmånadsförskjutningar

Låt oss titta på startmånadsoffset genom att beräkna MAX offset. Vi tar bort alla filter i datumtabellen och filtrerar ner till vald månad och valt år. För varje månad ska det bara finnas en förskjutning som motsvarar den månaden och året.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Från den punkten kan vi ta slutmånadsoffset , som bara är startmånadsoffset + 11 månader.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Och sedan tittar vi på varje valt datum och avgör om det faller inom den initiala månadskompensationen och slutmånadens offset. om den faller inom den perioden ger vi den en 1 och om inte, ger vi den en 0.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Om vi ​​går tillbaka till månadsvyn i vår visual kan vi se inom räckviddsvisualen som vi har satt som lika med ett. Så det visar bara de månaderna inom start till slut offset. Om vi ​​till exempel klickar på februari ser vi februari till januari.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Beräknar veckointervallet

Låt oss se hur det här ser ut ur veckosynpunkt. Det visuella börjar initialt okej och går från vecka 1 till vecka 52. Så långt har det gått bra.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Men om vi klickar på de andra åren i årskivan kan vi se 52:a veckan medan vissa har en 53:e vecka, vilket ger en hel del problem. Du kan se från detta exempel att problemet börjar visa sig.

Vi har en startperiod år 2020 och vecka 15 , men slutperioden är år 2021 och vecka 13 istället för år 2021 och vecka 14 .

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Om vi ​​går tillbaka till vecka 1 kan vi se att det börjar okej, men slutar vid vecka 52. Om vi ​​tittar på vecka 53 beräkning här så är maxveckantalet för 2020 och 2021 53 veckor. Detta kommer inte att fungera för veckogranularitet.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Låt oss se vad vi kan göra för att få det här att fungera. Vi måste fixa DAX-beräkningen här i den här delen:

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Detta beror på att i vissa fall är 51 korrekt när det bara är 52 veckor på ett år, men för året där det finns 53 veckor kommer det att avbryta den sista perioden. Detta är precis vad vi såg i den dynamiska visuella bilden i veckor, där beräkningen tog bort den sista perioden år 2020 och 2021.

För att åtgärda detta går vi till Within Range Weekly Wrong -måttet, som faktiskt ser enklare ut än det tidigare måttet. Vi hade ett startoffsetmått och beräknade max offset. Sedan tog vi bort filtret från datum och införde sedan filtret på vald vecka och valt år med antagandet att detta skulle leda till rätt offset.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Men det här fungerar inte eftersom det inte spelar någon roll om du använder en maxoffset eller en min offset. Allt vi gör är att linda en aggregator så att vi inte lägger en naken kolumn i en CALCULATE-sats.

Men om vi går tillbaka hit till ISO WeekNumber kan vi se att ett år och ett veckonummer inte unikt bestämmer en veckoförskjutning under den första perioden.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Jag kom på ett skottsäkert sätt att göra detta. Du kan använda MIN, men det är mer meningsfullt att skapa denna vecka 1 offsetmått . För att få vecka 1 offset, har vi att göra med vecka 2 eftersom den aldrig delas. Oavsett om det är 52 eller 53 veckor på året så förblir vecka 2 intakt.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

I den här beräkningen filtrerar vi ner till vecka 2 för att få offset. Och sedan när vi väl får den där vecka 2-offset, subtraherar vi bara en från den. Detta kommer otvetydigt att ge oss vecka 1 offset. Detta slutar med att lösa vårt problem.

Beräknar inom räckvidden varje vecka

Och sedan går vi tillbaka till vårt Inom Range Weekly- mått, och skriver en IF-sats där om skördenumret är för vecka 1, så beräknar vi vecka ett offset. Om det inte är vecka 1, beräknar vi bara startveckans offset som vi gjorde i föregående månadsberäkning.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Och då blir slutveckans offset startveckans offset + max veckotalet som antingen kan vara 52 eller 53. Sedan subtraherar vi bara 1 för att inte dubbelräkna startoffset.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Vi kan göra samma konstruktion som vi använde för månadsintervallet för att filtrera veckorna, där allt som faller mellan början och slutförskjutningen får en 1, och allt som inte får en 0.

Sedan ska vi placera måttet inom räckvidd veckovis i filterrutan. Allt checkar ut och ser helt rätt ut.

Tidsintelligens i DAX: Hur man dynamiskt väljer startperiod

Vi kan klicka på spelaxeln och köra veckans granularitet. Vi kan se att det fungerar korrekt precis som det gjorde i månadssammanhang.

Slutsats

Det här är en ganska djupdykning i tidsintelligens i DAX, där vi diskuterade hur vi kan lösa några av problemen kring veckonummer. Jag hoppas att du tyckte att den här handledningen var till hjälp och gav dig några ytterligare verktyg i din verktygslåda när du hanterar en problematisk veckosituation.

Om du gillade innehållet i denna handledning, glöm inte att prenumerera på LuckyTemplates TV-kanal. Vi har en enorm mängd innehåll som kommer ut hela tiden från mig själv och en rad innehållsskapare, alla dedikerade till att förbättra ditt sätt att använda LuckyTemplates och Power Platform.


Pipe In R: Anslutningsfunktioner med Dplyr

Pipe In R: Anslutningsfunktioner med Dplyr

I den här handledningen kommer du att lära dig hur du kopplar ihop funktioner med hjälp av dplyr-röroperatorn i programmeringsspråket R.

RANKX Deep Dive: A Lucky Templates DAX-funktion

RANKX Deep Dive: A Lucky Templates DAX-funktion

RANKX från LuckyTemplates låter dig returnera rankningen av ett specifikt nummer i varje tabellrad som utgör en del av en lista med nummer.

Extrahera LuckyTemplates-teman och bilder från PBIX

Extrahera LuckyTemplates-teman och bilder från PBIX

Lär dig hur du tar isär en PBIX-fil för att extrahera LuckyTemplates-teman och bilder från bakgrunden och använda den för att skapa din rapport!

Excel Formler Fuskblad: Mellanvägledning

Excel Formler Fuskblad: Mellanvägledning

Excel Formler Fuskblad: Mellanvägledning

LuckyTemplates Kalendertabell: Vad är det och hur man använder det

LuckyTemplates Kalendertabell: Vad är det och hur man använder det

LuckyTemplates Kalendertabell: Vad är det och hur man använder det

Python i LuckyTemplates: Hur man installerar och ställer in

Python i LuckyTemplates: Hur man installerar och ställer in

Lär dig hur du installerar programmeringsspråket Python i LuckyTemplates och hur du använder dess verktyg för att skriva koder och visa bilder.

Beräkna dynamiska vinstmarginaler – enkel analys av LuckyTemplates med DAX

Beräkna dynamiska vinstmarginaler – enkel analys av LuckyTemplates med DAX

Lär dig hur du beräknar dynamiska vinstmarginaler vid sidan av LuckyTemplates och hur du kan få fler insikter genom att gräva djupare i resultaten.

Sortering av datumtabellkolumner i LuckyTemplates

Sortering av datumtabellkolumner i LuckyTemplates

Lär dig hur du sorterar fälten från en utökad datumtabells kolumner korrekt. Detta är en bra strategi att göra för svåra fält.

Hitta dina bästa produkter för varje region i LuckyTemplates med DAX

Hitta dina bästa produkter för varje region i LuckyTemplates med DAX

I den här artikeln går jag igenom hur du kan hitta dina toppprodukter per region med hjälp av DAX-beräkningar i LuckyTemplates, inklusive TOPN- och CALCULATE-funktionerna.

Skräpdimension: Vad är det och varför det är allt annat än skräp

Skräpdimension: Vad är det och varför det är allt annat än skräp

Lär dig hur du använder en skräpdimension för flaggor med låg kardinalitet som du vill infoga i din datamodell på ett effektivt sätt.