Gå till huvudinnehåll Gå till ytterligare innehåll

Window Skriptfunktion

Window() utför beräkningar från flera rader i ett delavsnitt (eller "fönster") i en komplett tabell och producerar ett enda värde för varje rad.

Du kan använda Window-funktionerna för att utföra åtgärder som:

  • Jämföra ett individuellt talvärde i en rad med medelvärdet, maxvärdet eller minimivärdet i kolumnen.

  • Beräkna placeringen för ett enskilt värde, antingen i kolumnen eller i hela tabellen.

Window-funktionen ändrar inte antalet poster i tabellen men kan fortfarande utföra liknande uppgifter, t.ex. aggregering, relationella och intervallfunktioner.

Funktionen Window måste ingå i LOAD-satsen i den tabell du arbetar med, eller hänvisa till tabellen, t.ex. med en Resident LOAD. Se till exempel Exempel - lägga till ett fält som innehåller en aggregering:.

Namnet kan utelämnas, men detta resulterar i att fältnamnet sätts till hela funktionsuttrycket Window. Till exempel AvgDepSalary i exemplet nedan:

[AvgSalary]: Load *, Window(avg(Salary), Department) as AvgDepSalary Resident Employees;
Anteckning om information

Vi rekommenderar att du ger Window-funktionen ett fältnamn.

Window har stöd för allmänna funktioner, till exempel avrundning eller grundläggande numeriska operationer. Exempel:

Load *, Round(Window(Sum(Salary),Department)) as SumDepSalary
Load *, Window(Sum(Salary),Department) + 5 as SumDepSalary
Anteckning om information

Window-funktionen söker igenom hela tabellen. När det gäller minnesanvändning är kostnaden för denna skanning proportionerlig mot antalet fält i tabellen. En tabell med ett fåtal fält, förutom de som Window-funktionen arbetar med, är alltid att föredra framför en tabell med många fält.

Vanligtvis förbrukar en Window-funktion 2–4 gånger så mycket minne och tar 2–4 gånger längre tid att läsa in jämfört med en liknande skriptfunktion som innehåller samma aggregering, en Where-sats (filter), en Group by-sats (partition) och en Order by-sats (sort).

Syntax:  

Window (main_expr, [partition1, partition2, ...], [sort_type, [sort_expr],[filter_expr], [start_expr, end_expr]])

Datatyp för returen: Ett värde per rad, som kan kombineras med eller användas i ett annat uttryck, eller läggas till direkt i den resulterande tabell som skapas av LOAD-satsen.

Argument:  

Argument
ArgumentBeskrivning
main_expr

Det huvudsakliga indatauttrycket beräknas och returneras av funktionen. Det måste vara ett uttryck som baseras på en aggregering, till exempel Median(Salary). Exempel:

Window(Median(Salary)) as MedianSalary

Uttrycket kan också vara ett fältnamn utan att någon aggregering tillämpats. I det här fallet behandlar Window den som om Only()-funktionen har tillämpats på det fältet. Exempel:

Window(Salary) as WSalary

Uttryck som innehåller nästlade aggregeringsfunktioner eller nästlade fönsterfunktioner, t.ex. Window(Sum(Avg(Salary))) eller Window(Sum(Window(Salary))), är inte tillåtna.

partition1, partition2

Efter main_expr kan du definiera valfritt antal partitioner. Partitioner är fält som definierar vilka kombinationer som aggregeringarna ska tillämpas med. Exempel:

Window(Avg(Salary), Department) as AvgDepSalary

Detta beräknar den genomsnittliga lönen för varje avdelning.

När flera partitionsparametrar anges kommer aggregeringen att tillämpas på varje rad med en unik kombination av partitionsfält. Exempel:

Window(Avg(Salary), Department, Country) as AvgDepSalaryPerCountry

Detta beräknar den genomsnittliga lönen för varje avdelning i varje land. Kopior av avdelningar i olika länder, t.ex. Marknadsföring i Sverige och Marknadsföring i Kanada, kommer att behandlas som olika avdelningar.

Partitionering liknar den gruppering som uppnås genom group by klausulen. Partitioneringen minskar dock inte antalet poster jämfört med indatatabellen.

sort_type, [sort_expr]

Ange sorteringstyp och sorteringsuttryck (valfritt). Detta definierar den ordning i vilken aggregeringen utförs. sort_type är en konstant sträng och kan ha ett av tre värden:

  • ASC: stigande sortering.

  • DESC: fallande sortering.

  • NONE

Om du definierar sort_type ASC eller DESC måste du definiera ett sorteringsuttryck. Med sort_type NONE ska inget sorteringsuttryck anges. Sorteringsuttrycket avgör ordningen för raderna i en partition.

Exempel:

Window(RecNo(), Department, 'ASC', Year)

I exemplet ovan sorteras aggregationen i partitionen stigande av Årsfältet.

Sorteringsparametrarna påverkar också den ordning i vilken ett glidande fönster bearbetar en tabell. Exempel finns i Exempel – Lägga till ett fält med ett glidande fönster.

filter_expr

Lägg till ett filteruttryck (valfritt). Detta är ett booleskt uttryck som avgör huruvida posten ska inkluderas i beräkningen eller inte.

Om filter_expr tillhandahålls ska en sorteringstyp anges. Om ingen sorteringstyp är definierad kan argumentet tolkas som en partitionsparameter i stället för ett sorteringsuttryck. Parametern filter_expr kan utelämnas helt eller så kan ett sanningsenligt värde anges. Båda dessa resulterar i att inga filter används så att inga rader utesluts.

Exempel:

Window(avg(Salary), Department, 'ASC', Age, Country='US' Or Country='Canada') as AvgDepSalaryInUsOrCanada

Ovanstående Window-sats filtrerar bort alla rader där fältet Country inte är US eller Canada, vilket utesluter dessa rader från aggregeringen. Det kommer fortfarande att finnas utdatavärden för de rader som filtrerades bort, men precis som alla andra utdatarader kommer de bara att innehålla aggregerade resultat från rader som inte uteslutits av filtret.

start_expr,end_expr

Alternativt kan du ställa in argumentet för glidande fönster-funktionalitet. Detta begränsar ytterligare antalet rader som kan aggregeras tillsammans. Varje utdatarad kommer endast att innehålla (aggregerade) resultat från ett antal rader som föregår och följer på den aktuella raden. Ett glidande fönster kräver två argument (start_expr,end_expr). Om dessa argument anges ska sorteringstypen inte hoppas över. Annars kan argumenten tolkas som en partitionsparameter i stället för glidande fönster. Parametern start_expr,end_expr omfattar:

  • Startuttryck: antalet rader före den aktuella raden som ska inkluderas i fönstret.

  • Slututtryck: antalet rader efter den aktuella raden som ska inkluderas i fönstret.

Om du exempelvis vill inkludera de 3 föregående raderna, aktuell rad och nästa följande rad:

Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment

För att indikera alla föregående rader eller alla efterföljande rader kan du använda funktionen Unbounded(). Om du exempelvis vill inkludera alla föregående rader, aktuell rad och nästa följande rad:

Window(concat(Text(Salary),'-'), Department, 'NONE', 1, UNBOUNDED(), 1) as WSlidingSalaryDepartment

Om du exempelvis vill inkludera den tredje raden från den aktuella raden och alla efterföljande rader:

Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment

I exemplen ovan anges sorteringstypen NONE så att skriptet kan skilja mellan partitionsargument och de parametrar som kommer efter sorteringstyp.

Exempel - lägga till ett fält som innehåller en aggregering:

Exempel - lägga till ett fält som innehåller en aggregering som filtrerats för specifika värden

Exempel - Lägga till ett fält med ett glidande fönster

Exempel – Lägga till ett fält med ett glidande fönster

Begränsningar

Window har följande begränsningar:

  • Window är en resursintensiv funktion, framför allt avseende minnesförbrukning.

  • Window stöds inte i Qlik Sense Mobile.

  • Diagramuttrycken har inte stöd för Window.

  • Du kan inte nästla Window-funktioner inuti andra Window-funktioner.

  • Window kan inte användas inuti en aggregeringsfunktion.

  • Window kan inte användas i en LOAD-sats med en group by-sats.

  • Window måste kunna söka genom hela tabellen.

  • WRank(), RecNo() och RowNo() kan inte användas tillsammans med Window när glidande fönster-funktionaliteten används.

  • När funktionen med glidande fönster används ökar beräkningstiden med fönstrets storlek. Stora tabeller i kombination med stora fönsterstorlekar bör i allmänhet undvikas.

Var den här sidan till hjälp för dig?

Om du stöter på några problem med den här sidan eller innehållet på den, t.ex. ett stavfel, ett saknat steg eller ett tekniskt fel – meddela oss!