Window - Scriptfunctie
Window() voert berekeningen uit op basis van meerdere rijen van een sectie (of "kader") van een volledige tabel, en produceert een enkele waarde voor elke rij.
U kunt de Window-functies gebruiken om bewerkingen uit te voeren zoals:
-
Een individuele getalwaarde in een rij vergelijken met het gemiddelde, maximum of minimum binnen het kader van de tabel.
-
De positie van een individuele waarde berekenen, hetzij binnen het kader of in de gehele tabel.
De Window-functie verandert het aantal records in de tabel niet, maar kan wel vergelijke taken uitvoeren zoals aggregatie-, relationele en bereikfuncties.
De functie Window moet worden opgenomen in de LOAD-opdracht van de tabel waarmee u werkt, of er moet naar de tabel worden verwezen, zoals met een Resident-LOAD. Zie bijvoorbeeld Voorbeeld: een veld met een aggregatie toevoegen.
De naam kan worden weggelaten, maar dit leidt ertoe dat de veldnaam wordt ingesteld op de volledige uitdrukking van de Window functie. Bijvoorbeeld AvgDepSalary in het onderstaande voorbeeld:
Het wordt aanbevolen om de functie Window een veldnaam te geven.
Window ondersteunt algemene functies zoals afronding of basale numerieke bewerkingen. Bijvoorbeeld:
De functie Window scant de volledige tabel. Met betrekking tot het geheugengebruik zijn de kosten van het scannen gelijk aan het aantal velden in de tabel. Een tabel met een paar velden, naast de velden waarop de Window functie werkt, verdient altijd de voorkeur boven een tabel met veel velden.
Over het algemeen verbruikt een Window functie 2-4 keer zoveel geheugen en duurt het 2-4 keer langer om opnieuw te laden in vergelijking met een vergelijkbare scriptbewerking die dezelfde aggregatie, een Where clausule (filter), een Group by clausule (partitie) en een Order by clausule (sorteren) bevat.
Syntaxis:
Gegevenstype retourneren: één waarde per rij, die gecombineerd kan worden met of gebruikt kan worden in een andere uitdrukking, of direct toegevoegd kan worden aan de resulterende tabel die gemaakt is met de LOAD-instructie.
Argumenten:
Argument | Beschrijving |
---|---|
main_expr | De basis invoeruitdrukking die wordt berekend en geretourneerd door de functie. Het moet een uitdrukking zijn die is gebaseerd op een aggregatie, zoals Median(Salary). Bijvoorbeeld: Window(Median(Salary)) as MedianSalary De uitdrukking kan ook een veldnaam zijn zonder dat aggregatie is toegepast. In dit geval behandelt Window het alsof de Only()-functie is toegepast op dat veld. Bijvoorbeeld: Window(Salary) as WSalary Uitdrukkingen die geneste aggregatiefuncties of geneste window-functies bevatten, zoals Window(Sum(Avg(Salary))) of Window(Sum(Window(Salary))), zijn niet toegestaan. |
partition1, partition2 | Na main_expr kunt u een willekeurig aantal partities definiëren. Partities zijn velden die definiëren met welke combinaties de aggregaties moeten worden toegepast. Bijvoorbeeld: Window(Avg(Salary), Department) as AvgDepSalary Dit berekent het gemiddelde salaris voor elke afdeling. Als er meerdere partitieparameters worden opgegeven, wordt de aggregatie toegepast op elke rij met een unieke combinatie van partitievelden. Bijvoorbeeld: Window(Avg(Salary), Department, Country) as AvgDepSalaryPerCountry Dit berekent het gemiddelde salaris voor elke afdeling in elk land. Dubbele afdelingen in verschillende landen, zoals Marketing in Zweden en Marketing in Canada, worden als verschillende partities behandeld. Partitionering is vergelijkbaar met de groepering die wordt bereikt met de group by clausule. Partitioneren vermindert het aantal records niet in vergelijking met de invoertabel. |
sort_type, [sort_expr] | U kunt optioneel het sorteertype en de sorteeruitdrukking specificeren. Dit bepaalt de volgorde waarin de aggregatie wordt uitgevoerd. sort_type is een constante tekenreeks en kan een van drie waarden hebben:
Als u sort_type definieert als ASC of DESC, moet u een sorteeruitdrukking definiëren. Met sort_type NONE hoeft er geen sorteeruitdrukking worden opgegeven. De sorteeruitdrukking bepaalt de volgorde van de rijen in een partitie. Bijvoorbeeld: Window(RecNo(), Department, 'ASC', Year) In het bovenstaande voorbeeld wordt de aggregratie in de partitie in oplopende volgorde uitgevoerd door het veld Year. De sorteerparameters beïnvloeden ook de volgorde waarin een schuifvenster een tabel verwerkt. Zie bijvoorbeeld Voorbeeld - een veld met een gesorteerd schuifvenster toevoegen. |
filter_expr | U kunt optioneel een filteruitdrukking toevoegen. Dit is een booleaanse uitdrukking die bepaalt of de record in de berekening moet worden opgenomen of niet. Als filter_expr wordt opgegeven, moet er een sorteertype worden opgenomen. Als er geen sorteertype is gedefinieerd, dan kan het argument worden geïnterpreteerd als een partitieparameter in plaats van een filteruitdrukking. De parameter filter_expr kan volledig worden weggelaten of er kan een waarheidsgetrouwe waarde worden opgenomen. In beide gevallen worden er geen filters gebruikt, zodat er geen rijen worden uitgesloten. Bijvoorbeeld: Window(avg(Salary), Department, 'ASC', Age, Country='US' Or Country='Canada') as AvgDepSalaryInUsOrCanada De bovenstaande Window-instructie zal elke rij wegfilteren waarvan het veld Country niet US of Canada is, waardoor die rijen worden uitgesloten van de aggregatie. Er zullen nog steeds uitvoerwaarden zijn voor de rijen die werden uitgefilterd, maar net als alle andere uitvoerrijen zullen deze alleen samengevoegde resultaten bevatten van rijen die niet door het filter zijn uitgezonderd. |
start_expr,end_expr | Stel de argumenten voor de schuifvensterfunctie in (optioneel). Dit beperkt het aantal rijen dat geaggregeerd moet worden nog verder. Elke uitvoerrij bevat alleen (geaggregeerde) resultaten van een aantal rijen vóór en na de huidige rij. Een schuifvenster vereist twee argumenten (start_expr,end_expr). Als deze argumenten worden gegeven, dan mag het sorteertype niet worden overgeslagen. Anders kunnen de argumenten worden geïnterpreteerd als een partitieparameter in plaats van een schuifvenster. De parameter start_expr,end_expr bestaat uit:
Als u bijvoorbeeld 3 voorgaande rijen, de huidige rij en de volgende rij wilt toevoegen: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment Om alle eerdere rijen of alle volgende rijen aan te geven kunt u de Unbounded()-functie gebruiken. Bijvoorbeeld: om alle voorgaande rijen, de huidige rij en de volgende rij toe te voegen: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, UNBOUNDED(), 1) as WSlidingSalaryDepartment Bijvoorbeeld: om de derde rij uit de huidige rij en de daaropvolgende rijen toe te voegen: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment In de bovenstaande voorbeelden wordt het sorteertype NONE gegeven zodat het script onderscheid kan maken tussen partitie-argumenten en de parameters die na het sorteertype komen. |
Voorbeeld: een veld met een aggregatie toevoegen
Voorbeeld: een veld met een aggregatie toevoegen, gefilterd op specifieke waarden
Voorbeeld: een veld met een schuifvenster toevoegen
Beperkingen
Window heeft de volgende beperkingen:
Window is een functie die veel resources gebruikt, vooral wat betreft geheugen.
Window wordt niet ondersteund in Qlik Sense Mobile.
Diagramuitdrukkingen bieden geen ondersteuning voor Window.
U kunt Window-functies niet in andere Window-functies nesten.
Window kan niet worden gebruikt in een aggregatiefunctie.
Window kan niet worden gebruikt in een LOAD-instructie met een groeperen op-clausule.
Window moet de hele tabel kunnen scannen.
WRank(), RecNo() en RowNo() kunnen niet worden gebruikt met Window wanneer de schuifvensterfunctionaliteit wordt gebruikt.
Wanneer de schuifvensterfunctionaliteit wordt gebruikt, neemt de berekeningstijd toe met de grootte van het venster. Grote tabellen in combinatie met grote vensters moeten over het algemeen worden vermeden.