Window — funkcja skryptu
Window() wykonuje obliczenia na podstawie wielu wierszy sekcji (czyli „okna”) pełnej tabeli i tworzy pojedynczą wartość dla każdego wiersza.
Za pomocą funkcji Window można wykonać takie operacje jak:
-
Porównywanie pojedynczej wartości liczbowej w wierszu ze średnią, maksymalną lub minimalną wartością w oknie tabeli.
-
Obliczanie rangi pojedynczej wartości w oknie lub w całej tabeli.
Funkcja Window nie zmienia liczby rekordów w tabeli, ale nadal może wykonywać podobne zadania jak funkcje agregujące, relacyjne i zakresu.
Funkcja Window musi być zawarta w instrukcji LOAD tabeli, z którą pracujesz, lub odwoływać się do tabeli, takiej jak Resident LOAD. Przykład można znaleźć w artykule Przykład — dodawanie pola zawierającego agregację.
Nazwę można pominąć, ale spowoduje to ustawienie nazwy pola na całe wyrażenie funkcji Window. Na przykład AvgDepSalary w poniższym przykładzie:
Zaleca się nadanie funkcji Window nazwy pola.
Window obsługuje funkcje ogólne, takie jak zaokrąglanie czy podstawowe operacje liczbowe. Na przykład:
Funkcja Window skanuje całą tabelę. Jeśli chodzi o wykorzystanie pamięci, koszt tego skanowania jest proporcjonalny do liczby pól w tabeli. Tabela z kilkoma polami, oprócz tych, na których działa funkcja Window, jest zawsze preferowana niż tabela z wieloma polami.
Zazwyczaj funkcja Window zużywa 2–4 razy więcej pamięci i zajmuje 2–4 razy więcej czasu na przeładowanie w porównaniu do podobnej operacji skryptu zawierającej tę samą agregację, klauzulę Where (filtr), klauzulę Group by (partycjonowanie) i klauzulę Order by (sortowanie).
Składnia:
Zwracany typ danych: jedna wartość na wiersz, która może zostać połączona z innym wyrażeniem lub użyta w nim albo dodana bezpośrednio do tabeli wynikowej utworzonej przez instrukcję LOAD.
Argumenty:
Argument | Opis |
---|---|
main_expr | Główne wyrażenie wejściowe obliczone i zwrócone przez funkcję. Musi to być dowolne wyrażenie oparte na agregacji, takie jak Median(Salary). Na przykład: Window(Median(Salary)) as MedianSalary Wyrażenie może być również nazwą pola bez zastosowania agregacji. W tym przypadku Window traktuje je tak, jakby funkcja Only() została zastosowana do tego pola. Na przykład: Window(Salary) as WSalary Wyrażenia zawierające zagnieżdżone agregacje lub zagnieżdżone funkcje okna, takie jak Window(Sum(Avg(Salary))) lub Window(Sum(Window(Salary))) nie są dozwolone. |
partition1, partition2 | Po main_expr możesz zdefiniować dowolną liczbę partycji. Partycje to pola definiujące kombinacje, z którymi mają być stosowane agregacje. Na przykład: Window(Avg(Salary), Department) as AvgDepSalary Oblicza to średnie wynagrodzenie dla każdego działu. Jeśli podano kilka parametrów partycjonowania, agregacja zostanie zastosowana do każdego wiersza z unikalną kombinacją pól partycji. Na przykład: Window(Avg(Salary), Department, Country) as AvgDepSalaryPerCountry Oblicza to średnie wynagrodzenie dla każdego działu w każdym z krajów. Duplikowane działy w różnych krajach, takie jak Marketing w Szwecji i Marketing w Kanadzie, będą traktowane jako różne partycje. Partycjonowanie jest podobne do grupowania osiąganego przez klauzulę group by. Partycjonowanie nie zmniejsza jednak liczby rekordów w porównaniu do tabeli wejściowej. |
sort_type, [sort_expr] | Opcjonalnie określ typ sortowania i wyrażenie sortowania. Określa kolejność, w jakiej wykonywana jest agregacja. sort_type jest stałym ciągiem znaków i może przyjmować jedną z trzech wartości:
Jeśli zdefiniujesz sort_type ASC lub DESC, musisz zdefiniować wyrażenie sortowania. W przypadku sort_type NONE nie należy podawać wyrażenia sortowania. Wyrażenie sortowania określa kolejność wierszy w partycji. Na przykład: Window(RecNo(), Department, 'ASC', Year) W powyższym przykładzie agregacja w ramach partycji jest wykonywana rosnąco według pola Year. Parametry sortowania wpływają również na kolejność, w jakiej okno przesuwane przetwarza tabelę. Przykład można znaleźć w temacie Przykład — dodawanie pola z sortowanym oknem przesuwanym. |
filter_expr | Opcjonalnie dodaj wyrażenie filtru. Jest to wyrażenie logiczne, które decyduje, czy rekord powinien zostać uwzględniony w obliczeniach, czy nie. Jeśli podano filter_expr, należy podać typ sortowania. Jeśli nie zdefiniowano typu sortowania, argument może być interpretowany jako parametr partycji, a nie wyrażenie filtru. Parametr filter_expr można całkowicie pominąć lub uwzględnić wartość będącą prawdą. W obu przypadkach nie są używane żadne filtry, więc żadne wiersze nie są wykluczane. Na przykład: Window(avg(Salary), Department, 'ASC', Age, Country='US' Or Country='Canada') as AvgDepSalaryInUsOrCanada Powyższa instrukcja Window odfiltruje każdy wiersz, w którym pole Country nie ma wartości US lub Canada, wykluczając te wiersze z agregacji. Nadal będą dostępne wartości wyjściowe dla wierszy, które zostały odfiltrowane, ale podobnie jak wszystkie inne wiersze wyjściowe, będą one zawierać tylko zagregowane wyniki z wierszy, które nie zostały wykluczone przez filtr. |
start_expr,end_expr | Opcjonalnie ustaw argumenty dotyczące funkcjonalności okna przesuwanego. To dodatkowo ogranicza liczbę wierszy, które mogą być agregowane razem. Każdy wiersz wyjściowy będzie zawierał tylko (zagregowane) wyniki z szeregu wierszy poprzedzających bieżący wiersz i następujących po nim. Okno przesuwane wymaga dwóch argumentów: (start_expr,end_expr). Jeśli argumenty te zostaną podane, wówczas typ sortowania nie powinien zostać pominięty. W przeciwnym razie argumenty mogą zostać zinterpretowane jako parametr partycji zamiast okna przesuwanego. Parametr start_expr,end_expr obejmuje:
Na przykład, jeśli chcesz uwzględnić 3 poprzedzające wiersze, bieżący wiersz i następny wiersz: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, -3, 1) as WSlidingSalaryDepartment Aby wskazać wszystkie poprzednie wiersze lub wszystkie następne wiersze, możesz użyć funkcji Unbounded(). Na przykład, aby uwzględnić wszystkie poprzedzające wiersze, bieżący wiersz i następny wiersz: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, UNBOUNDED(), 1) as WSlidingSalaryDepartment Na przykład, aby uwzględnić trzeci wiersz od bieżącego wiersza i wszystkie kolejne wiersze: Window(concat(Text(Salary),'-'), Department, 'NONE', 1, 3, UNBOUNDED()) as WSlidingSalaryDepartment W powyższych przykładach podano typ sortowania NONE, aby skrypt mógł rozróżnić argumenty partycji i parametry, które występują po typie sortowania. |
Przykład — dodawanie pola zawierającego agregację
Przykład — dodawanie pola zawierającego agregację przefiltrowanego pod kątem konkretnych wartości
Przykład — dodawanie pola z oknem przesuwanym
Ograniczenia
Window ma następujące ograniczenia:
Window jest funkcją wymagającą dużej ilości zasobów, szczególnie pod względem wykorzystania pamięci.
Funkcja Window nie jest obsługiwana w Qlik Sense Mobile.
Wyrażenia wykresów nie obsługują Window.
Nie można zagnieżdżać funkcji Window wewnątrz innych funkcji Window.
Window nie można używać w funkcji agregacji.
Window nie można użyć w instrukcji load z klauzulą group by.
Window musi być w stanie przeskanować całą tabelę.
WRank(), RecNo() ani RowNo() nie można używać z Window podczas korzystania z funkcjonalności okna przesuwanego.
Gdy używana jest funkcja okna przesuwanego, czas obliczeń wzrasta wraz z rozmiarem okna. Zasadniczo należy unikać dużych tabel w połączeniu z dużymi rozmiarami okien.