Menu
Coddy logo textTech

ROWS & RANGE Criterion

Coddy'nin SQL Journey'sinin Temeller bölümünün bir parçası — ders 69 / 72.

Şu anda, öncesinde veya sonrasında kaç satır dikkate alınacağını seçme konusunda esnek olamıyoruz. Artık ROWS & RANGE kriterleri ile mümkün. Onları kullanmak için şöyle yazarız:

OVER (ROWS BETWEEN --START-- AND --END--)

OVER (RANGE BETWEEN --START-- AND --END--)

Ve şu seçenekleri belirtebiliriz:

  • CURRENT ROW - mevcut satır
  • n PRECEDING - mevcut satırdan önceki satırlar
  • n FOLLOWING - mevcut satırdan sonraki satırlar 

ROWS & RANGE arasındaki fark, ROWS kriterinin değerleri umursamaması, sadece konumları dikkate almasıdır; oysa RANGE pencereyi satır konumları yerine değer aralıkları açısından tanımlar.

RANGE için ORDER BY --column_name-- belirtmemiz gerekir, çünkü aksi takdirde pencereyi nasıl seçeceğini bilemez.

Örneğin:

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

Burada mevcut satırı, ondan önceki satırı ve sonraki satırı içeren bir pencere oluşturur.

RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levels

Burada her seviye için (artan sırada sıralanmış) mevcut seviye, bir önceki seviye ve bir sonraki seviyeyi içeren bir pencere oluşturur. Mevcut seviye 5 ise, 4, 5 ve 6 seviyelerini içerir.

Not: RANGE BETWEEN kullanımı pencerenizde daha fazla satırın dahil edilmesine neden olabilir, çünkü aralıktaki değerlerle aynı değerleri paylaşan tüm satırları içerir; oysa ROWS BETWEEN her zaman aynı sayıda satırı içerir (veri kümesinde mevcut oldukları sürece). 

Ayrıca RANGE tarih sütunlarını desteklemez.

İşte ROWS ile RANGE arasındaki farkı göstermek için basit bir örnek:

ROWS kullanılarak:

SELECT employee_name, salary,
    AVG(salary) OVER (
        ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
    ) as avg_salary_rows

RANGE Kullanarak:

SELECT employee_name, salary,
    AVG(salary) OVER (
        ORDER BY salary
        RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
    ) as avg_salary_range
challenge icon

Görev

Kolay

Mevcut tablolar ve sütunlar:

  • <strong>newspapers</strong>: <strong>date</strong>, <strong>num_newspapers</strong>

Bu meydan okumada üretim için gazetelerimiz var. Mevcut satırdan iki gün önce ve bir gün sonra basılan gazetelerin ortalamasını bilmek istiyoruz. Ayrıca, mevcut tarihten itibaren ve ondan önceki üç günün tamamında basılan gazetelerin maksimum ve minimum sayıları arasındaki farkı bilmek istiyoruz. Bu sütunları sırasıyla avg_newspapers ve diff_newspapers olarak adlandırın.

Kendin dene

quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler