Bästa praxis för att skapa beräkningar i Tableau

Denna artikel beskriver flera tips och riktlinjer för att skapa effektiva beräkningar i Tableau. Dessa riktlinjer är avsedda att hjälpa dig att optimera arbetsbokens prestanda. Mer information om alla sätt att förbättra arbetsbokens prestanda finns i serien Optimera arbetsboksprestanda.

Allmän regel: Undvik att använda ett beräknat fält flera gånger i en annan beräkning

Att referera till samma beräknade fält flera gånger inom en annan beräkning kommer att resultera i prestandaproblem. Om du använder ett beräknat fält i en beräkning (även känt som att skapa en inkapslad beräkning), försök då att referera till det endast en gång i beräkningen.

Observera att referenser till ett fält (terminalfält) flera gånger i en beräkning inte bör försämra prestandan.

Exempel

Låt oss säga att du skapar ett beräknat fält som använder en komplicerad flerradig beräkning för att hitta omnämnanden, eller ”Twitter-handtag”, i tweets. Det beräknade fältet heter ”Twitter Handle”. Varje handtag som returneras börjar med tecknet ”@” (till exempel: @user).

För din analys vill du ta bort symbolen ”@”.

För att göra detta kan du använda följande beräkning för att ta bort det första tecknet från strängen:

RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)

Denna beräkning är ganska enkel. Eftersom den refererar till Twitter-handtagsberäkningen två gånger utför den emellertid beräkningen två gånger för varje post i datakällan: en gång för funktionen RIGHT och en gång för funktionen LEN.

För att undvika att beräkna samma beräkning mer än en gång kan du skriva om beräkningen till en som endast använder beräkningen för Twitter-handtag en gång. I det här exemplet kan du använda MID för att uppnå samma mål:

MID([Twitter Handle], 2)

Tips 1: Konvertera flera jämlikhetsjämförelser till ett skiftlägesuttryck (CASE) eller en grupp

Låt oss säga att du har följande beräkning, som använder det beräknade fältet, Person (calc), flera gånger och använder en rad OR-funktioner. Denna beräkning, även om det är ett enkelt logiskt uttryck, kommer att orsaka frågeprestandaproblem eftersom den utför personberäkningen (calc) minst tio gånger.

IF [Person (calc)] = 'Henry Wilson'
OR [Person (calc)] = 'Jane Johnson'
OR [Person (calc)] = 'Michelle Kim'
OR [Person (calc)] = 'Fred Suzuki'
OR [Person (calc)] = 'Alan Wang'
THEN 'Lead'
ELSEIF [Person (calc)] = 'Susan Nguyen'
OR [Person (calc)] = 'Laura Rodriguez'
OR [Person (calc)] = 'Ashley Garcia'
OR [Person (calc)] = 'Andrew Smith'
OR [Person (calc)] = 'Adam Davis'
THEN 'IC'
END

Istället för att använda en jämlikhetsjämförelse, prova följande lösningar.

Lösning 1

Använd ett skiftlägesuttryck (CASE). Till exempel:

CASE [Person (calc)]
WHEN 'Henry Wilson' THEN 'Lead'
WHEN 'Jane Johnson' THEN 'Lead'
WHEN 'Michelle Kim' THEN 'Lead'
WHEN 'Fred Suzuki' THEN 'Lead'
WHEN 'Alan Wang' THEN 'Lead'

WHEN 'Susan Nguyen' THEN 'IC'
WHEN 'Laura Rodriguez' THEN 'IC'
WHEN 'Ashley Garcia' THEN 'IC'
WHEN 'Andrew Smith' THEN 'IC'
WHEN 'Adam Davis' THEN 'IC'
END

I det här exemplet refereras det beräknade fältet, Person (calc), endast en gång. Därför utförs det endast en gång. CASE-uttrycken optimeras också ytterligare i förfrågningspipelinen, detta så att du får en ytterligare prestationsfördel.

Lösning 2

Skapa en grupp istället för ett beräknat fält. Du hittar mer information i Gruppera dina data.

Tips 2: Konvertera flera strängberäkningar till ett enda REGEXP-uttryck

Obs! Den här funktionen är endast tillgänglig för Tableau-dataextrakt eller vid koppling till Textfil, Hadoop Hive, Google BigQuery, PostgreSQL, Tableau-dataextrakt, Microsoft Excel, Salesforce, Vertica, Pivotal Greenplum, Teradata (version 14.1 och senare) samt Oracle-datakällor. Du hittar mer information i Ytterligare funktioner.


Exempel 1: CONTAINS

Låt oss säga att du har följande beräkning, som använder det beräknade fältet, Kategori (calc), flera gånger. Denna beräkning, även om den också är ett enkelt logiskt uttryck, kommer att orsaka frågeprestandaproblem eftersom den utför beräkningen av kategorin (Calc) flera gånger.

IF CONTAINS([Segment (calc)],'UNKNOWN')
OR CONTAINS([Segment (calc)],'LEADER')
OR CONTAINS([Segment (calc)],'ADVERTISING')
OR CONTAINS([Segment (calc)],'CLOSED')
OR CONTAINS([Segment (calc)],'COMPETITOR')
OR CONTAINS([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Du kan använda ett REGEXP-uttryck för att få samma resultat utan lika mycket upprepning.

Lösning

IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'
ELSE [Segment (calc)] END


Med strängberäkningar som använder ett liknande mönster kan du använda samma REGEXP-uttryck.

Exempel 2: STARTSWITH

IF STARTSWITH([Segment (calc)],'UNKNOWN')
OR STARTSWITH([Segment (calc)],'LEADER')
OR STARTSWITH([Segment (calc)],'ADVERTISING')
OR STARTSWITH([Segment (calc)],'CLOSED')
OR STARTSWITH([Segment (calc)],'COMPETITOR')
OR STARTSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'

Lösning

IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observera att symbolen ”^” används i denna lösning.

Exempel 3: ENDSWITH

IF ENDSWITH([Segment (calc)],'UNKNOWN')
OR ENDSWITH([Segment (calc)],'LEADER')
OR ENDSWITH([Segment (calc)],'ADVERTISING')
OR ENDSWITH([Segment (calc)],'CLOSED')
OR ENDSWITH([Segment (calc)],'COMPETITOR')
OR ENDSWITH([Segment (calc)],'REPEAT')
THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Lösning

IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'
ELSE [Segment (calc)] END

Observera att symbolen ”$” används i denna lösning.

Tips 3: Manipulera strängar med REGEXP istället för LEFT, MID, RIGHT, FIND, LEN

Regelbundna uttryck kan vara ett mycket kraftfullt verktyg. När du utför komplex strängmanipulering, överväg då att använda reguljära uttryck. I många fall kommer användningen av ett reguljärt uttryck att resultera i en kortare och effektivare beräkning. För mer information om reguljära uttryck, se inlägget Bli van vid regex och brottas med icke-perfekta data(Länken öppnas i ett nytt fönster) i Tableau-bloggen.

Exempel 1

Låt oss säga att du har följande beräkning, som tar bort protokoll från webbadresser. Till exempel: ”https://www.tableau.com” blir ”www.tableau.com”.

IF (STARTSWITH([Server], "http://")) THEN
MID([Server], Len("http://") + 1)
ELSEIF(STARTSWITH([Server], "https://")) THEN
MID([Server], Len("https://") + 1)
ELSEIF(STARTSWITH([Server], "tcp:")) THEN
MID([Server], Len("tcp:") + 1)
ELSEIF(STARTSWITH([Server], "\\")) THEN
MID([Server], Len("\\") + 1)
ELSE [Server]
END

Lösning

Du kan förenkla beräkningen och förbättra prestandan genom att använda en REGEXP_REPLACE-funktion.

REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", "")

Exempel 2

Låt oss säga att du har följande beräkning, som returnerar den andra delen av en IPv4-adress. Till exempel: ”172.16.0.1” blir ”16”.

IF (FINDNTH([Server], ".", 2) > 0) THEN
MID([Server],
FIND([Server], ".") + 1,
FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1
)
END

Lösning

Du kan förenkla beräkningen och förbättra prestandan genom att använda en REGEXP_EXTRACT-funktion.

REGEXP_EXTRACT([Server], "\.([^\.]*)\.")

Tips 4: Använd inte uppsättningar i beräkningar

Om du använder uppsättningar i en beräkning, överväg då att ersätta dem med en alternativ men likvärdig beräkning.

Exempel

Låt oss säga att du har följande beräkning som använder uppsättningen Toppkunder (uppsättning).

IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END

Lösning 1

Om uppsättningen är enkel kan du skapa ett beräknat fält som returnerar samma resultat som uppsättningen. Till exempel:

CASE [Customer Name]
WHEN 'Henry Wilson' THEN True
WHEN 'Jane Johnson' THEN True
WHEN 'Michelle Kim' THEN True
WHEN 'Fred Suzuki' THEN True
WHEN 'Alan Wang' THEN True
ELSE False
END


Obs! Användning av mönstret WHEN TRUE … ELSE rekommenderas i denna situation för att undvika prestandaproblem på grund av användning av uppsättningar. Det är inte ett rekommenderat mönster i de flesta scenarier.

Lösning 2

Om uppsättningen är mer komplex kan du överväga att skapa en grupp som kartlägger alla element i uppsättningen till ett givet värde eller attribut, t.ex. ”IN”, och sedan ändra beräkningen för att söka efter det värdet/attributet. Till exempel:

IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END

Mer information finns i Gruppera dina data och Skapa uppsättningar.

Tips 5: Använd inte uppsättningar för att gruppera dina data

Uppsättningar är avsedda att göra jämförelser på delmängder av data. Grupper är avsedda att kombinera relaterade medlemmar i ett fält. Konvertering av uppsättningar till grupper, till exempel med följande exempel, rekommenderas inte:

IF [Americas Set] THEN "Americas"
ELSEIF [Africa Set] THEN "Africa"
ELSEIF [Asia Set] THEN "Asia"
ELSEIF [Europe Set] THEN "Europe"
ELSEIF [Oceania Set] THEN "Oceania"
ELSE "Unknown"
END

Detta rekommenderas inte av följande skäl:

  • Uppsättningar är inte alltid exklusiva. Vissa medlemmar kan visas i flera uppsättningar. Ryssland skulle till exempel kunna placeras både i Europa och Asien.

  • Uppsättningar kan inte alltid översättas till grupper. Om uppsättningarna definieras genom uteslutning, villkor eller begränsningar kan det vara svårt eller till och med omöjligt att skapa en motsvarande grupp.

Lösning

Gruppera dina data med hjälp av funktionen Gruppera. Du hittar mer information i Gruppera dina data.

Se även

Skapa effektiva beräkningar

Optimera arbetsboksprestanda

Beräkningstyper i Tableau

Funktioner i Tableau

Tack för din feedback!Din feedback har skickats in. Tack!