Przeskocz do zawartości głównej Przejdź do treści uzupełniającej

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:

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

Zaleca się nadanie funkcji Window nazwy pola.

Window obsługuje funkcje ogólne, takie jak zaokrąglanie czy podstawowe operacje liczbowe. Na przykład:

Load *, Round(Window(Sum(Salary),Department)) as SumDepSalary
Load *, Window(Sum(Salary),Department) + 5 as SumDepSalary
Informacja

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:  

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

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:  

Argumenty
ArgumentOpis
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:

  • ASC: sortowanie rosnące.

  • DESC: sortowanie malejące.

  • NONE

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:

  • Wyrażenie początkowe: liczba wierszy przed bieżącym wierszem, które mają zostać uwzględnione w oknie.

  • Wyrażenie końcowe: liczba wierszy po bieżącym wierszu, które mają zostać uwzględnione w oknie.

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

Przykład — dodawanie pola z sortowanym 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.

Czy ta strona była pomocna?

Jeżeli natkniesz się na problemy z tą stroną lub jej zawartością — literówkę, brakujący krok lub błąd techniczny — daj nam znać!