Ana içeriğe geç

Yeni Başlayanlar için Snowflake QUALIFY: Nedir ve Nasıl Kullanılır?

Bu rehber, Snowflake QUALIFY ifadesini anlaşılır kılar; alt sorgular olmadan pencere fonksiyonlarını filtreleyerek SQL sorgularını nasıl sadeleştireceğinizi gösterir—daha temiz ve daha hızlı analizler için idealdir.

Yapay Zeka ile Keşfedin

Snowflake ile çalışan bir veri profesyoneli olarak, zaman zaman sorgu sonuçlarını pencere fonksiyonlarına göre filtrelemeniz gerekebilir. Geleneksel olarak bu, alt sorgular veya karmaşık filtreleme mantığı gerektirir. Ancak Snowflake güçlü bir alternatif sunar: QUALIFY ifadesi. 

Bu rehberde, filtrelemeyi sadeleştirmek için QUALIFY kullanımını adım adım örneklerle ve en iyi uygulamalarla anlatacağım.

Snowflake'te QUALIFY İfadesi Nedir?

Snowflake'teki QUALIFY ifadesi, sonuçları pencere fonksiyonlarıyla filtrelemek için kullanılır. Pencere fonksiyonlarını ya SELECT listesinde tanımlayabilir ya da doğrudan QUALIFY ifadesi içinde referans verebilirsiniz.

Genellikle WHERE, ham satırları birleştirme/özetleme öncesinde filtrelerken, HAVING bir GROUP BY toplamasından sonra filtreleme yapar.

Buna karşılık QUALIFY, ROW_NUMBER(), RANK() ve DENSE_RANK() gibi SQL ifadelerinin sonuçlarını filtrelemeye imkân tanır. Yani pencere fonksiyonlarımızın çıktılarından yararlanıp hemen bunlar üzerinde filtre uygulayabiliriz.

QUALIFY'i, toplamlarda HAVING'in yaptığı işi pencere fonksiyonları için yapan bir ifade olarak düşünebilirsiniz—hesaplama tamamlandıktan sonra sonucu filtreler.

QUALIFY ifadesinin özellikle faydalı olduğu çeşitli kullanım senaryoları vardır: 

  • Pencere fonksiyonlarının çıktısına göre sorgu sonuçlarını filtrelemeniz gerekir.
  • Alt sorgu ihtiyacını azaltarak SQL sorgularınızı sadeleştirmek istersiniz.
  • Veriyi bölümler (partition) içinde verimli şekilde sıralamanız, yinelenenleri ayıklamanız veya segmentlere ayırmanız gerekir.
  • Kategori başına en iyi performans gösteren kayıtları gerektiren bir rapor veya gösterge paneli hazırlıyorsunuzdur.

> Snowflake'e yeniyseniz, Introduction to Snowflake kursumuz, QUALIFY gibi ifadelere geçmeden önce uygulamalı bir başlangıç sunar. Ayrıca Snowflake’in daha geniş yeteneklerini bu yeni başlayanlara uygun eğitimle keşfedebilirsiniz.

Snowflake'te QUALIFY Sözdizimi

QUALIFY'in temel sözdizimini gözden geçirerek bölümlerini anlayalım. QUALIFY kullanan basit bir sorgu şöyle görünebilir:

SELECT
 column1,
 column2, 
 window_function() OVER (PARTITION BY column3 ORDER BY column4) AS rank
FROM table_name
QUALIFY window_function_condition;

Alışıldık SELECT ifadesini, ardından birkaç sütunu görürsünüz. Sonra bize rank adlı bir sütun oluşturmak için alışıldık biçimde yazılmış window_function() yer alır.

Tabloyu belirten FROM ifadesi ve en sonda da QUALIFY bulunur. Bu QUALIFY'i “window_function_condition” takip eder; bu genellikle bir eşitliktir ve QUALIFY rank = 1 gibi görünebilir.

Not: QUALIFY ifadesi içinde bir pencere fonksiyonunun takma adını (alias) referans verebilir veya tüm pencere fonksiyonu ifadesini yeniden yazabilirsiniz. Her iki yaklaşım da çalışır.

> Pencere fonksiyonlarını tazelemeniz gerekiyorsa bu pencere fonksiyonları cheat sheet'ine göz atın. 

Snowflake'te QUALIFY Kullanım Örnekleri

Artık QUALIFY'in genel yapısını bildiğinize göre, bu ifadeyi kullanarak bazı somut örnekler göstereceğim.

Örnek 1: Grup başına en üst N satırı filtreleme

Diyelim ki her departmandaki en yüksek maaş alan ilk 3 çalışanı bulmak istiyoruz. Önce QUALIFY kullanmayan bir örneğe bakalım, ardından bunu kullanan daha öz bir sürümü görelim.

/* First we have to rank all the employees */
WITH ranked_employees AS (
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees)

/* Then we query to subquery and filter using WHERE */
SELECT *
FROM ranked_employees
WHERE rank <= 3;

Gördüğünüz gibi, yukarıdaki örnek bir CTE gerektiriyor; oysa QUALIFY ile sorgu daha yalın hale geliyor:

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank <= 3;

Yukarıdaki sorgu, her departmandaki çalışanlara bir sıralama atar ve departman başına en iyi 3 kişiyi döndürür. Alt sorgu veya CTE olmadan, doğrudan filtrelemek için QUALIFY ifadesini kullanır. Bu, sorgu uzunluğu ve yanıt süresinin kritik olduğu gösterge panelleri veya API'ler için özellikle kullanışlıdır.

Örnek 2: Yinelenen kayıtları filtreleme

Bir tabloda yinelenen kayıtlar varsa ve bir derecelendirme fonksiyonuna göre yalnızca ilk görüneni tutmak istiyorsak, ROW_NUMBER() ile QUALIFY kullanabiliriz:

SELECT 
order_id, 
customer_id, 
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_num
FROM orders
QUALIFY row_num = 1;

row_num sütunu, her müşteri için bölümlendirip sipariş tarihine göre sıralayarak oluşturulur. Bu, en erken olandan başlayarak her siparişe artan bir sıra numarası atar. QUALIFY row_num = 1 ile filtreleyerek her müşteri için yalnızca en erken siparişin tutulmasını sağlarız.

Bu teknik, veri temizleme sırasında yinelenenleri giderme (deduplikasyon) görevlerinde yaygın olarak kullanılır.

Örnek 3: Toplamalarda pencere fonksiyonuna göre filtreleme

Biraz daha ileri gidelim. Toplamsal pencere fonksiyonlarıyla QUALIFY kullanmak, daha esnek ve dinamik filtreleme sağlar.

Örneğin, maaşı departman ortalamasının üzerinde olan çalışanları bulmak istersek, pencere fonksiyonu üzerinde AVG() ile QUALIFY kullanabiliriz:

SELECT 
employee_id, 
department, 
salary,
AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees
QUALIFY salary > avg_salary;

Bu tür bir mantık, akran grupları içinde aykırı değerleri veya en iyi performans gösterenleri belirlemek için harikadır.

> Bu tür daha karmaşık sorgular için SQL becerilerinizi güçlendirmek istiyorsanız, Intermediate SQL kursumuza göz atın.

Snowflake'te QUALIFY Kullanımı için En İyi Uygulamalar

İşte bir QUALIFY ifadesi için bazı en iyi uygulamalar ve kullanım alanları. 

Karmaşık sorguları sadeleştirin

QUALIFY'in gücü, ekstra alt sorgular ve CTE'lere duyulan ihtiyacı ortadan kaldırarak sorguları sadeleştirme becerisinde yatar. Bu işlevsellikten yararlanın. Bir pencere fonksiyonu yazdığınızda ve çıktısına göre filtrelemeniz gerektiğinde, alt sorgu oluşturmadan QUALIFY kullanın.

Daha az CTE, daha kolay hata ayıklama, daha net mantık ve daha iyi bakım yapılabilirlik demektir.

QUALIFY'i diğer pencere fonksiyonlarıyla birleştirin

Daha rafine filtreleme için birden fazla pencere fonksiyonunu birleştirebilirsiniz. Örneğin, eşitlikleri çözmek ve sonuçları sınırlandırmak için ROW_NUMBER() ile RANK()'i birlikte kullanmak:

SELECT 
employee_id, 
department, 
salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
       ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC, employee_id) AS row_num
FROM employees
QUALIFY rank <= 3 AND row_num <= 3;

Bu sorgu, departmanında en yüksek 3 maaş sıralaması içine giren çalışanları döndürür. Ancak, ilk 3 içinde üçten fazla çalışan eşitlenirse, çalışan kimliğine göre sıralanan ilk üçü gösterir.

Performansla ilgili hususlar

Yazılan kod açısından QUALIFY sorguları sadeleştirirken, bazı performans yönleri dikkate alınmalıdır.

Pencere fonksiyonları hesaplama açısından maliyetli olabilir ve kötü yapılandırılmış sorgular kaynak tüketimini artırabilir. Şu kavramları aklınızda bulundurun:

  • Pencere fonksiyonları büyük veri kümelerinde hesaplama açısından maliyetli olabilir; bunları sürecinizin hangi aşamasında kullandığınıza dikkat edin.
  • Performansı iyileştirmek için uygun indeksleme ve bölümlendirme yapın.
  • Test sırasında daha yüksek verimlilik için QUALIFY ile birlikte LIMIT kullanın.
  • Snowflake’in Query Profile aracını kullanarak pencereli sorgulardaki performans darboğazlarını belirleyin.

QUALIFY Sorgularında Sorun Giderme

Pencere fonksiyonlarının karmaşıklığı nedeniyle QUALIFY ifadelerinde hatalara düşmek kolaydır. Karşılaşabileceğiniz yaygın sorunlar için bazı ipuçları aşağıda.

1. WHERE içinde pencere fonksiyonları kullanmak

Pencere fonksiyonlarını doğrudan WHERE içinde kullanmaya çalışmak hataya yol açar; çünkü WHERE, pencere fonksiyonları işlenmeden önce değerlendirilir.

-- This will cause an error
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
WHERE rank = 1;

Çözüm: Pencere fonksiyonlarından sonra değerlendirilen QUALIFY ifadesini kullanın.

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

2. QUALIFY içinde koşul ifadesini atlamak

QUALIFY ifadesi, pencere fonksiyonlarının sonuçlarını filtrelemek için bir koşul (predicate) gerektirir. Koşulun atlanması hataya yol açar.

-- This will cause an error
SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY RANK() OVER (PARTITION BY department ORDER BY salary DESC);

Çözüm: QUALIFY ifadesinin = 1 gibi bir koşul içerdiğinden emin olun; bu, en üst sıradaki satırı filtrelemek için kullanılabilir.

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

3. Muğlak takma adlar

Bir sütun ve bir pencere fonksiyonu için aynı takma adı kullanmak, karışıklığa ve beklenmedik sonuçlara yol açabilir.

-- Potentially ambiguous
SELECT salary AS rank,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

Çözüm: Muğlaklığı önlemek için farklı takma adlar kullanın.

SELECT salary AS salary_amount,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees
QUALIFY salary_rank = 1;

4. Hatalı bölümlendirme veya sıralama

Pencere fonksiyonlarında PARTITION BY veya ORDER BY ifadelerinin hatalı belirtilmesi beklenmedik sonuçlara neden olabilir.

Çözüm: İstenen mantıkla eşleşecek şekilde bölümlendirme ve sıralamayı dikkatle tanımlayın. Örneğin, departman başına en yüksek maaş için:

SELECT employee_id, department, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;

Sonuç

Snowflake'teki QUALIFY ifadesi, pencere fonksiyonlarına dayalı sonuçları filtrelemek için güçlü bir araçtır; alt sorgu ihtiyacını azaltır ve sorguları daha okunur hale getirir. Bunu etkin biçimde kullanmayı anlayarak, veri bilimcileri sıralanmış, gruplanmış veya toplanmış verilerle çalışırken sorgularını sadeleştirip verimliliği artırabilir.

Hazır mısınız Snowflake ve SQL becerilerinizi bir adım ileri taşımaya? Introduction to Snowflake kursumuzla başlayın, analitik sorgularınızı PostgreSQL pencere fonksiyonları kursu ile geliştirin veya kariyerinizi Associate Data Engineer in SQL eğitim yoluyla ilerletin!

SSS

QUALIFY, WHERE ve HAVING’den nasıl farklıdır?
  • WHERE, toplama öncesinde ham veriyi filtreler.
  • HAVING, GROUP BY sonrasında toplanmış veriyi filtreler.
  • QUALIFY, pencere fonksiyonları uygulandıktan sonra sonuçları filtreler.
QUALIFY sorgu performansını artırır mı?

QUALIFY sorguları sadeleştirip alt sorgu ihtiyacını azaltabilir; ancak performans veri boyutu ve indekslemeye bağlıdır. Uygun bölümlendirme performansın iyileştirilmesine yardımcı olabilir.

SUM() veya AVG() gibi sıralama dışı pencere fonksiyonlarıyla QUALIFY kullanabilir miyim?

Evet, ancak filtreleme koşulunun mantıklı olduğundan emin olun. Örneğin, ortalamanın üzerindeki maaşlara göre çalışanları filtrelemek işe yarar, çünkü AVG() her bölüm için hesaplanabilir.

QUALIFY ile birden fazla pencere fonksiyonu kullanabilir miyim?

Evet. Tek bir sorguda birkaç pencere fonksiyonunu birleştirebilir ve QUALIFY içinde mantıksal koşullarla bunlardan birine ya da birkaçına dayalı filtreleme yapabilirsiniz.

Snowflake'te QUALIFY’i ne zaman kullanmamalıyım?

Mantığınız pencere fonksiyonlarına dayanmıyorsa veya QUALIFY, iç içe geçmiş karmaşık mantık nedeniyle sorgunun hata ayıklamasını zorlaştırıyorsa kullanmaktan kaçının.

QUALIFY, Snowflake’teki tüm pencere fonksiyonlarını destekler mi?

Evet. ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE() gibi fonksiyonlar ile OVER() kullanan toplamsal fonksiyonların tümü QUALIFY ile filtrelenebilir.

QUALIFY sadece Snowflake’e mi özgü?

QUALIFY, Snowflake ve BigQuery gibi birkaç platformda desteklenir; ancak standart ANSI SQL’in parçası değildir, bu nedenle taşınabilirlik sorun olabilir.

QUALIFY’i CTE veya alt sorgular içinde iç içe kullanabilir miyim?

Evet, QUALIFY Ortak Tablo İfadeleri (CTE) veya alt sorgular içinde kullanılabilir; bu da modüler SQL tasarımı için esneklik sağlar.

Snowflake’te QUALIFY ile ilgili hataları nasıl ayıklarım?

Önce takma ad çakışmalarını kontrol edin, tüm pencere fonksiyonlarının doğru tanımlandığından emin olun ve performans veya mantık sorunlarını gidermek için Snowflake’in Query Profile aracını kullanın.

Tim Lu

Yazar

Tim Lu

Mekânsal analiz, makine öğrenimi ve veri hatları konusunda deneyime sahip bir veri bilimciyim. GCP, Hadoop, Hive, Snowflake, Airflow ve diğer veri bilimi/mühendisliği süreçleriyle çalıştım.

Konular

İlgili