Ana içeriğe geç

QUALIFY: İhtiyacınız Olduğunu Bilmediğiniz SQL Filtreleme İfadesi

SQL'deki QUALIFY ifadesi, temel ancak daha az bilinen bir filtreleme yöntemidir. Sözdizimini, kullanım alanlarını ve diğer SQL filtreleme yöntemlerinden nasıl farklılaştığını öğrenin.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Structured Query Language (SQL), dünyanın en önemli programlama dillerinden biridir ve veri bilimciler ile veri mühendisleri tarafından yoğun biçimde kullanılır. 

Daha fazla kişi işlerini veriye dayandırdıkça, SQL uzmanlığına olan talep yıllar içinde yalnızca arttı. Neyse ki dil hem öğrenmesi kolay hem de köklü; bu da, takıldığınızda sizi destekleyecek geniş bir kullanıcı topluluğu olduğu anlamına gelir.

Bu yazıda, SQL dilindeki QUALIFY adlı özel bir ifadeyi ele alacağız. Yazının sonunda şunları bileceksiniz:

  • QUALIFY için temel kavram ve sözdizimi
  • QUALIFY ifadesini ne zaman kullanmanız gerektiği
  • Diğer filtreleme yöntemlerinden nasıl farklılaştığı.

SQL QUALIFY İfadesinin Temel Kavramı ve Sözdizimi

QUALIFY, bir pencere fonksiyonunun sonuçlarını filtrelemek için kullanılan bir ifadedir. Bu nedenle, QUALIFY ifadesini başarıyla kullanmak için SELECT listesinde veya QUALIFY ifadesinde en az bir WINDOW fonksiyonu bulunmalıdır – yalnızca boole ifadesinin TRUE olarak değerlendirildiği satırlar döndürülür.

İpucu: SQL Pencere Fonksiyonları Cheat Sheet'ine göz atın.

QUALIFY ifadesi olmasaydı, bir PENCERE fonksiyonunun sonuçlarını filtrelemek için iç içe sorgulara ihtiyaç duyulurdu. SQL geliştiricileri genellikle, iç içe sorguların kodu daha az okunabilir hale getirmesi ve hata ayıklama ile işbirliğini zorlaştırması nedeniyle mümkün olduğunca bu yaklaşımdan kaçınılmasını önerir.

Başka bir deyişle, QUALIFY ifadesinin arkasındaki temel fikir, pencere fonksiyonlarının sonucuna göre filtreleme gerektiren sorguları basitleştirmektir; bu da QUALIFY'nin, pencere fonksiyonları hesaplandıktan sonra değerlendirildiği anlamına gelir.

QUALIFY ifadesi içeren bir sorgu için tipik yürütme sırası şöyledir:

  • FROM
  • WHERE
  • GROUP BY ve Toplamalar
  • HAVING
  • WINDOW
  • QUALIFY
  • DISTINCT
  • ORDER BY
  • LIMIT

Bir QUALIFY ifadesinin genel sözdizimi şu şekildedir:

QUALIFY <predicate>

Genel biçimiyle şöyle görünecektir:

SELECT <column_list>
  FROM <data_source>
  [GROUP BY ...]
  [HAVING ...]
  QUALIFY <predicate>
  [ ... ]

Not: <predicate>, toplamalar ve pencere fonksiyonları hesaplandıktan sonra sonucu filtrelemek için kullanılan bir ifadedir.

SQL QUALIFY Ne Zaman Kullanılır

QUALIFY ifadesi, bir alt sorguya ihtiyaç duymadan filtreleme yapabilmesi açısından HAVING ifadesine oldukça benzer. Örneğin, bir analitik fonksiyonun – bir satır grubuna göre toplu bir değer hesaplayan fonksiyon – sonuçlarını filtrelemek için QUALIFY kullanabilirsiniz.

QUALIFY'yi tam olarak ne zaman kullanacağınıza açıklık getirmek için kısa bir senaryo:

Diyelim ki veri bilimcisi olarak çalışıyorsunuz ve bir paydaş sizden her müşterinin son oturum açma bilgilerini istiyor. İlk sorgunuz şöyle görünebilir:

SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) as previous_logins
FROM login_logs
WHERE TRUE 

Bu iyi bir başlangıçtır, ancak tüm oturumları döndüreceği için paydaşın isteğini karşılamaz; yalnızca en son oturumu döndürmez. Son oturumu almak için bir filtre eklememiz gerekir.

SQL'e yeni başlayanlar, aşağıdaki gibi WHERE ifadesiyle filtreleme yapmaya çalışarak hataya düşebilir:

SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) AS previous_logins
FROM login_logs
WHERE TRUE 
  AND last_login = 1

Ne yazık ki bu kod çalışmayacaktır; GROUP BY ve HAVING denerseniz de aynı durum geçerlidir.

Bunun nedeni, bir önceki bölümde tartıştığımız işlem sırasına dayanır.

WHERE, GROUP BY ve HAVING, WINDOW fonksiyonlarından önce değerlendirilir; bu da WINDOW fonksiyonlarını filtreleyemeyecekleri anlamına gelir, çünkü onların varlığından haberdar değildirler – bu üç ifade çalıştırıldığında pencere fonksiyonu henüz değerlendirilmemiştir.

Filtrenin WINDOW fonksiyonundan sonra gelmesini sağlamanın bir yolu, bir Common Table Expression (CTE) kullanmaktır.

Kodumuz şöyle görünecek:

WITH 
logins AS (
  SELECT 
      user_id, 
      ip, 
      country_code,
      os,
      RANK() OVER (
        PARTITION BY user_id ORDER BY log_datetime DESC
      ) AS previous_logins
  FROM login_logs
  WHERE TRUE
)

SELECT user_id, ip, country_code, os 
FROM logins
WHERE previous_logins = 1

Teknik olarak bu kod geçerlidir – sorunsuz şekilde çalışır ve paydaşınızın istediği sonuçları döndürür.

Ancak iki sorgu tanıtmamız ve birkaç ek satır kod yazmamız gerekti; bu da bu işlemi düzenli olarak tekrarlıyorsanız gereksiz hale gelebilir.

Bu sorun için en iyi çözüm QUALIFY kullanmaktır.

Kod şöyle görünecek:

-- Starter code from @Jiho Choi on StackOverflow 
SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) as previous_logins
FROM login_logs
WHERE TRUE 
QUALIFY previous_logins = 1

Bu çözüm işe yarar, çünkü QUALIFY ifadeleri SQL'in işlem sıralamasında WINDOW fonksiyonlarından sonra değerlendirilir; dolayısıyla onların varlığından haberdardır ve aynı sorgu içinde filtreleyebilir.

QUALIFY'nin daha az satır kod yazmaktan başka ne faydası var diye merak ediyor olabilirsiniz; yanıt, performans açısından pek bir fayda olmadığıdır.

Kullandığımız CTE çözümü ile QUALIFY çözümü benzer sürelerde çalışır; bu yüzden QUALIFY çözümünün kayda değer bir performans artışı sağladığını söyleyemeyiz.

Asıl fayda, kullanım kolaylığıdır; daha az kod ve daha yüksek okunabilirlik.

SQL QUALIFY'yi Diğer Filtreleme Yöntemleriyle Karşılaştırma

Artık, QUALIFY ifadesinin SQL'de mevcut başka bir filtreleme yöntemi olduğunu ve en iyi ne zaman kullanılacağını biliyorsunuz.

Peki QUALIFY ile diğer filtreleme yöntemleri arasındaki fark nedir?

Hadi her bir filtreleme yöntemini özetleyelim.

WHERE ifadesi

WHERE, bir tablodaki kayıtları filtrelemek için kullanılır; yani satır işlemleri uygular. Belirli bir koşulu sağlayan kayıtları çıkarmak istediğimizde kullanırız. Örneğin, bir veri kümesini birinin yaşına göre filtrelemek isteyebiliriz. Kodda şöyle görünecektir:

SELECT name, gender, height, weight, age 
FROM gym_members_info 
WHERE age < 23; 

WHERE ifadesiyle ilgili dikkat edilmesi gereken başlıca noktalar şunlardır.

  1. Belirli bir koşula göre kayıtları filtrelemek için kullanılır.
  2. İşlemler satırlar üzerinde uygulanır.
  3. GROUP BY ifadesi olmadan da WHERE ifadesini kullanabilirsiniz.
  4. WHERE, SELECT, UPDATE, DELETE ifadeleriyle birlikte kullanılabilir.

Bunu HAVING ifadesiyle karşılaştıralım.

HAVING ifadesi

HAVING, GROUP BY ifadesiyle tanımlanan gruplardan belirli bir koşula göre kayıtları filtrelemek için kullanılır. Dolayısıyla WHERE ve HAVING arasındaki en belirgin fark, HAVING'in başarılı bir şekilde değerlendirilebilmesi için bir GROUP BY ifadesi gerektirmesidir.

Bunun başlıca faydası, HAVING ifadesini, WHERE bloğunda mümkün olmayan bir şekilde, toplanmış grupların bir alt kümesine uygulayabilmenizdir.

Örneğin:

SELECT gender, AVG(height) 
FROM gym_members_info
GROUP BY gender 
HAVING AVG(height) > 170 

Yukarıdaki kod, ortalama boyu 170 santimetreden büyük olan cinsiyet gruplarını döndürecektir; başka bir deyişle, HAVING bir sütun işlemi uygular.

Dikkat edilmesi gereken bir başka nokta, HAVING'in WHERE'in aksine yalnızca SELECT ifadesiyle birlikte kullanılabilmesidir.

QUALIFY ifadesi

QUALIFY, HAVING'in karşılığıdır; ancak HAVING toplu fonksiyonlar ve GROUP BY ifadeleri üzerinde filtreleme yaparken, QUALIFY, WINDOW fonksiyonlarının sonuçları üzerinde filtre uygular – GROUP BY nasıl kullanılır hakkında daha fazla bilgi edinin.

Her yaş grubundaki en uzun kişiyle ilgili bilgileri bilmek isteseydik, hesaplamayı yapmak için bir WINDOW fonksiyonu, yalnızca her yaş grubundaki en uzun kişiyi bulmak için sonuçları filtrelemek üzere de bir QUALIFY ifadesi kullanabilirdik.

Kodda şöyle görünecektir:

SELECT name, gender, height, weight, age 
RANK() over (
    PARTITION BY age ORDER BY height DESC
  ) as ranked_ages
FROM gym_members_info
WHERE TRUE
QUALIFY ranked_ages = 1

Özetle, QUALIFY ifadesi, kullanıcının belirlediği ölçütlere göre zaten hesaplanmış sıralı analitik bir fonksiyonun çıktısını filtrelemek için kullanılan bir koşullu ifadeyi belirtir.

Sonuç ve İleri Düzey Çalışma

SQL, tipik bir veri bilimi iş akışında önemli bir rol oynar; QUALIFY gibi yararlı işlemleri SQL'de nasıl uygulayacağınızı bilmek, daha temiz kod yazmanıza olanak tanıdığı için son derece faydalıdır; bu da başkalarının sizinle işbirliği yapmasını kolaylaştırır.

SQL becerilerinizi ilerletmek isterseniz aşağıdaki kaynaklara göz atmanızı öneririz:

Kurtis Pykes

Yazar

Kurtis Pykes

Konular

İlgili