QUALIFY i window functions w Snowflake – czysty SQL bez podzapytań
Poznaj moc funkcji okienkowych i klauzuli QUALIFY w Snowflake. Dowiedz się, jak pisać czysty SQL bez podzapytań i skutecznie filtrować dane.
Artykuł przeznaczony dla analityków danych, inżynierów danych i osób pracujących z SQL w Snowflake, które znają podstawy zapytań i chcą stosować funkcje okienkowe oraz QUALIFY w praktyce.
Z tego artykułu dowiesz się
- Jak działają funkcje okienkowe w Snowflake i jaką składnię stosować z OVER, PARTITION BY oraz ORDER BY?
- Do czego służy klauzula QUALIFY i jak upraszcza filtrowanie wyników funkcji okienkowych bez podzapytań?
- Jak wykorzystać funkcje okienkowe i QUALIFY do rankingów, deduplikacji oraz analizy zmian w czasie?
Wprowadzenie do funkcji okienkowych i klauzuli QUALIFY w Snowflake
W pracy z danymi często zachodzi potrzeba przeprowadzenia zaawansowanej analizy, która wykracza poza standardowe agregacje. Właśnie tu z pomocą przychodzą funkcje okienkowe (ang. window functions) — potężne narzędzie SQL pozwalające na wykonywanie operacji analitycznych w obrębie określonego zbioru wierszy, zwanego oknem, bez konieczności grupowania danych.
Funkcje okienkowe umożliwiają obliczenia takie jak rankingi, sumy skumulowane, różnice między wartościami czy dostęp do poprzednich lub kolejnych wierszy, jednocześnie zachowując widoczność całego zbioru danych na poziomie zapytania. Dzięki temu można elastycznie analizować dane bez utraty kontekstu poszczególnych rekordów.
Równocześnie, Snowflake wprowadza unikalne rozszerzenie składni SQL w postaci klauzuli QUALIFY. Umożliwia ona filtrowanie wyników zapytań na podstawie wartości zwracanych przez funkcje okienkowe, co wcześniej wymagało stosowania podzapytań lub zapytań zagnieżdżonych. QUALIFY pozwala na uproszczenie składni i uczynienie zapytań bardziej czytelnymi i wydajnymi.
Łącząc funkcje okienkowe z klauzulą QUALIFY, użytkownicy Snowflake mogą tworzyć złożone analizy i transformacje danych przy użyciu czystego SQL — bez konieczności odwoływania się do dodatkowych warstw zapytań czy skomplikowanych konstrukcji logicznych.
W kolejnych częściach artykułu przyjrzymy się bliżej składni funkcji okienkowych, zasadzie działania klauzuli QUALIFY oraz praktycznym zastosowaniom tych narzędzi w codziennej pracy z danymi w Snowflake.
Podstawy składni funkcji okienkowych
Funkcje okienkowe (ang. window functions) w SQL – a w szczególności w Snowflake – umożliwiają wykonywanie obliczeń na zbiorze wierszy powiązanych logicznie z bieżącym wierszem, bez konieczności agregowania danych czy stosowania zagnieżdżonych zapytań. Dzięki nim możliwe jest analizowanie danych w kontekście ich otoczenia, np. obliczanie sum narastających, rankingów, różnic między wartościami czy identyfikowanie pierwszego i ostatniego wystąpienia w danej grupie.
Podczas szkoleń Cognity ten temat wraca regularnie – dlatego zdecydowaliśmy się go omówić również tutaj.
Charakterystyczną cechą funkcji okienkowych jest to, że nie redukują liczby wierszy w wyniku zapytania – każdy wiersz pozostaje, ale może zostać wzbogacony o dodatkowe wyliczenia. To odróżnia je od tradycyjnych funkcji agregujących, które zwracają jeden wynik na grupę.
Podstawowa składnia funkcji okienkowej obejmuje słowo kluczowe OVER, które definiuje zakres wierszy (okno), do których odnosi się dana funkcja. Wewnątrz klauzuli OVER można używać fraz takich jak PARTITION BY – do grupowania danych – oraz ORDER BY, określającej kolejność w ramach każdej grupy. Opcjonalnie można również definiować ramy okna (ROWS BETWEEN), co pozwala precyzyjnie kontrolować, które wiersze są brane pod uwagę w obliczeniach.
Dzięki dużej elastyczności składni i obsłudze wielu funkcji, takich jak ROW_NUMBER, RANK, LAG, LEAD czy SUM, funkcje okienkowe są niezwykle przydatnym narzędziem w analizie danych, porządkowaniu informacji oraz budowaniu zaawansowanych logik raportowych bez konieczności sięgania po bardziej złożone struktury SQL.
Rola klauzuli QUALIFY w filtrowaniu wyników funkcji okienkowych
Funkcje okienkowe (ang. window functions) w SQL umożliwiają wykonywanie obliczeń na zbiorach danych bez konieczności ich agregowania, co pozwala na zachowanie szczegółowości poszczególnych wierszy. Jednak podczas pracy z tymi funkcjami często pojawia się potrzeba przefiltrowania wyników na podstawie wartości zwracanych przez funkcje okienkowe. W standardowym SQL wymaga to stosowania zapytań zagnieżdżonych – najpierw obliczamy funkcję okienkową w podzapytaniu, a potem filtrujemy jej wyniki w zapytaniu głównym.
Snowflake upraszcza ten proces dzięki klauzuli QUALIFY. Pozwala ona filtrować bezpośrednio po wynikach funkcji okienkowych w tej samej klauzuli, bez potrzeby tworzenia zagnieżdżonych zapytań lub wspólnych wyrażeń tabelarycznych (CTE).
Główne różnice między tradycyjnym podejściem a użyciem QUALIFY prezentuje poniższa tabela:
| Aspekt | Tradycyjne podejście (z podzapytaniami) | QUALIFY w Snowflake |
|---|---|---|
| Filtrowanie po funkcjach okienkowych | Wymaga zagnieżdżenia zapytania | Możliwe bezpośrednio w klauzuli QUALIFY |
| Czytelność kodu | Niższa – więcej warstw zapytań | Wyższa – prostsza, płaska składnia |
| Wydajność i optymalizacja | Potencjalnie bardziej złożona optymalizacja | Lepsze wykorzystanie optymalizacji zapytania Snowflake |
Przykładowo, aby wybrać pierwszy wiersz z każdej grupy według funkcji ROW_NUMBER(), w klasycznym podejściu można użyć:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY created_at DESC) AS rn
FROM products
)
WHERE rn = 1;
Z użyciem QUALIFY w Snowflake, ten sam efekt można osiągnąć znacznie prościej:
SELECT *
FROM products
QUALIFY ROW_NUMBER() OVER (PARTITION BY category ORDER BY created_at DESC) = 1;
Dzięki QUALIFY, Snowflake pozwala pisać bardziej zwięzłe i czytelne zapytania, co przekłada się na lepszą produktywność i łatwiejsze utrzymanie kodu SQL. Jeśli chcesz szybko nauczyć się, jak efektywnie pracować z funkcjami okienkowymi i innymi możliwościami Snowflake – sprawdź nasz Kurs Snowflake Essentials.
Zastosowanie funkcji okienkowych do tworzenia rankingów
Jednym z najczęstszych zastosowań funkcji okienkowych w Snowflake jest tworzenie rankingów w obrębie wybranych grup danych, bez konieczności korzystania z podzapytań. Dzięki temu analiza danych staje się bardziej przejrzysta i wydajna. Na warsztatach Cognity wiele osób dopiero pierwszy raz zauważa, jak bardzo to zagadnienie wpływa na ich efektywność.
Do budowania rankingów służą w szczególności funkcje takie jak:
- ROW_NUMBER() – przypisuje unikalny numer porządkowy w ramach każdej partycji, bez względu na wartości wierszy,
- RANK() – przypisuje rangi z uwzględnieniem remisów (te same wartości mają tę samą rangę, kolejna wartość otrzymuje rangę z przeskokiem),
- DENSE_RANK() – przypisuje rangi z uwzględnieniem remisów, ale bez przeskoków w numeracji.
Wszystkie te funkcje działają w oparciu o klauzulę OVER(), która definiuje partycjonowanie i porządkowanie danych. Przykład prostego rankingu sprzedaży w ramach regionów mógłby wyglądać następująco:
SELECT
region,
salesperson,
total_sales,
RANK() OVER (PARTITION BY region ORDER BY total_sales DESC) AS sales_rank
FROM sales_data;
W powyższym przykładzie każdemu sprzedawcy w danym regionie przypisywana jest ranga na podstawie wielkości sprzedaży. To pozwala nie tylko na łatwe porównania, ale także na dalsze filtrowanie wyników – na przykład ograniczenie ich do top 3 sprzedawców w każdym regionie (co szczegółowo omówimy w następnych częściach).
Poniższa tabela ilustruje różnice między poszczególnymi funkcjami rankingowymi:
| Funkcja | Remisy | Numeracja kolejna | Typowy przypadek użycia |
|---|---|---|---|
ROW_NUMBER() |
Pomija | Ciągła (1, 2, 3...) | Dedupikacja, unikalna identyfikacja wierszy |
RANK() |
Uwzględnia | Skoki (1, 1, 3...) | Klasyczne rankingi z remisami |
DENSE_RANK() |
Uwzględnia | Bez skoków (1, 1, 2...) | Ranking bez przeskoków pozycji |
Funkcje rankingowe w Snowflake, zwłaszcza w połączeniu z klauzulą QUALIFY, umożliwiają pisanie zwięzłego i wydajnego kodu SQL, który w wielu przypadkach eliminuje potrzebę stosowania podzapytań.
Deduplikacja danych z użyciem ROW_NUMBER i QUALIFY
Deduplikacja danych to jedno z najczęstszych zadań w przetwarzaniu danych — szczególnie w hurtowniach danych, gdzie integruje się wiele źródeł. W Snowflake można to osiągnąć w prosty i czytelny sposób, korzystając z funkcji okienkowej ROW_NUMBER() w połączeniu z klauzulą QUALIFY.
Tradycyjnie eliminacja duplikatów wymagała użycia zagnieżdżonych zapytań lub tymczasowych tabel, co zwiększało złożoność i zmniejszało przejrzystość kodu SQL. Snowflake umożliwia uproszczenie tego procesu dzięki podejściu deklaratywnemu, które nie wymaga podzapytań.
Przykład sytuacji, w której deduplikacja jest przydatna, to tabela zawierająca wiele rekordów opisujących tę samą jednostkę (np. klienta) z różnymi znacznikami czasu aktualizacji. W takim przypadku często chcemy zachować tylko najnowszy wpis dla każdego unikalnego identyfikatora.
SELECT *
FROM customers
QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY updated_at DESC) = 1;
Powyższy kod ilustruje wykorzystanie ROW_NUMBER() do numerowania rekordów w ramach każdej grupy customer_id, przy czym rekord z najnowszym updated_at otrzymuje numer 1. Dzięki klauzuli QUALIFY, filtrujemy tylko te rekordy, dla których numer ten wynosi 1 — czyli najnowsze wersje każdego klienta.
Poniżej zestawienie tradycyjnego podejścia z użyciem podzapytania i nowoczesnego podejścia z użyciem QUALIFY:
| Metoda | Opis |
|---|---|
| Podzapytanie | Wymaga zagnieżdżenia zapytania z funkcją okienkową wewnątrz głównego zapytania SELECT |
| QUALIFY + ROW_NUMBER() | Bezpośrednie filtrowanie wyników funkcji okienkowej w jednym zapytaniu |
Takie podejście nie tylko upraszcza składnię, ale również poprawia czytelność i łatwość utrzymania kodu SQL. W kolejnych przykładach zobaczymy, jak jeszcze można wykorzystać ROW_NUMBER() i QUALIFY do bardziej zaawansowanych scenariuszy deduplikacji. Jeśli chcesz jeszcze lepiej poznać możliwości Snowflake, zapraszamy do udziału w naszym Kursie Python i Snowflake – Data Engineering w chmurze: od zapytań do automatyzacji.
Analiza czasowa z wykorzystaniem funkcji okienkowych
Funkcje okienkowe w Snowflake oferują potężne narzędzia do analizy danych w czasie. Umożliwiają one operacje na zbiorach danych bez konieczności stosowania podzapytań lub łączenia wielu tabel. Dzięki nim można w prosty sposób obserwować zmiany wartości w kolejnych okresach, obliczać różnice pomiędzy wierszami czy identyfikować trendy w danych.
Typowe zastosowania funkcji okienkowych w analizie czasowej obejmują:
- Obliczanie różnic (lag/lead): porównywanie wartości z poprzedniego lub kolejnego okresu.
- Agregacje biegłe (running totals): np. skumulowana suma sprzedaży w czasie.
- Porównania okresowe: np. rok do roku (YoY), miesiąc do miesiąca (MoM).
- Identyfikacja pierwszego i ostatniego wystąpienia w grupie czasowej: np. pierwsza transakcja klienta w miesiącu.
Poniżej znajduje się prosty przykład użycia funkcji LAG() do analizy zmian wartości sprzedaży w czasie:
SELECT
customer_id,
order_date,
sales_amount,
LAG(sales_amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS previous_sales,
sales_amount - LAG(sales_amount) OVER (PARTITION BY customer_id ORDER BY order_date) AS sales_change
FROM orders;
W powyższym zapytaniu funkcja okienkowa pozwala uzyskać wartość sprzedaży z poprzedniego zamówienia tego samego klienta oraz obliczyć różnicę względem bieżącego zamówienia. Dzięki temu można łatwo wykrywać wzorce, wzrosty lub spadki w zachowaniu zakupowym.
Funkcje okienkowe wykorzystywane w analizie czasowej są nie tylko wydajne, ale także znacznie czytelniejsze niż alternatywne podejścia oparte na podzapytaniach. Ułatwiają one interpretację wyników oraz skracają czas potrzebny na przygotowanie analiz.
Porównanie podejścia z QUALIFY i zagnieżdżonymi zapytaniami
W języku SQL filtrowanie wyników funkcji okienkowych tradycyjnie wiązało się z koniecznością używania zagnieżdżonych zapytań. W Snowflake pojawiła się jednak alternatywa w postaci klauzuli QUALIFY, która znacząco upraszcza ten proces. Oba podejścia prowadzą do podobnych rezultatów, ale ich zastosowanie i czytelność kodu różnią się istotnie.
Zagnieżdżone zapytania wymagają tworzenia podzapytań (np. w klauzuli FROM), w których obliczane są funkcje okienkowe, a dopiero potem następuje ich filtrowanie w klauzuli WHERE lub HAVING. Takie podejście może być mniej przejrzyste i trudniejsze w utrzymaniu, zwłaszcza gdy zapytanie staje się bardziej złożone.
W przeciwieństwie do tego, QUALIFY umożliwia filtrowanie wyników funkcji okienkowych bez konieczności tworzenia podzapytań. Dzięki temu cały proces można zrealizować w jednym, płaskim zapytaniu, co znacząco poprawia jego czytelność i skraca czas pisania kodu.
Wybór pomiędzy tymi metodami zależy od kontekstu użycia, złożoności analizy oraz preferencji zespołu pracującego nad danym rozwiązaniem. Klauzula QUALIFY to nowoczesne podejście, które wspiera bardziej przejrzysty i zwięzły kod SQL – zwłaszcza w środowisku Snowflake.
Wprowadzenie do funkcji okienkowych i klauzuli QUALIFY w Snowflake
Funkcje okienkowe (ang. window functions) oraz klauzula QUALIFY stanowią potężne narzędzia dostępne w Snowflake do zaawansowanej analizy danych w ramach czystego SQL, bez konieczności budowania zagnieżdżonych zapytań. Dzięki nim możliwe jest nie tylko tworzenie rankingów czy analiz porównawczych, ale również filtrowanie wyników funkcji analitycznych w sposób bardziej przejrzysty i efektywny.
Funkcje okienkowe pozwalają na wykonywanie obliczeń (takich jak sumy skumulowane, porównania między wierszami, funkcje rankingowe) w kontekście określonego zestawu wierszy – tzw. okna – bez grupowania danych i utraty szczegółowości. W przeciwieństwie do tradycyjnych agregacji, nie redukują liczby wierszy w wynikach, co czyni je idealnym rozwiązaniem w wielu przypadkach analizy danych.
Z kolei klauzula QUALIFY umożliwia filtrowanie wyników zapytań na podstawie wartości zwracanych przez funkcje okienkowe, bez konieczności używania podzapytań lub CTE (Common Table Expressions). To znacznie upraszcza składnię i poprawia czytelność zapytań, szczególnie w przypadkach, gdy zależy nam na wybieraniu tylko określonych wierszy po przetworzeniu danych przy użyciu funkcji analitycznych.
Obie te możliwości — funkcje okienkowe i QUALIFY — wspierają tworzenie bardziej zwięzłych i wydajnych zapytań SQL. W dalszych częściach artykułu przyjrzymy się im bliżej, omawiając zarówno ich składnię, jak i praktyczne zastosowania w codziennej pracy z danymi w Snowflake. Jeśli chcesz poznać więcej takich przykładów, zapraszamy na szkolenia Cognity, gdzie rozwijamy ten temat w praktyce.