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.

Kopya kağıdı

ROWS ve RANGE'i pencere fonksiyonlarında esnek pencere çerçevelerini tanımlamak için kullanın:

ROWS - satır konumlarına göre pencereyi tanımlar:

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

RANGE - değer aralıklarına göre pencereyi tanımlar (ORDER BY gerektirir):

OVER (ORDER BY column_name RANGE BETWEEN --START-- AND --END--)

Pencere sınır seçenekleri:

  • CURRENT ROW - mevcut satır
  • n PRECEDING - mevcut öncesinde n satır/değer
  • n FOLLOWING - mevcut sonrasında n satır/değer

Örnekler:

-- ROWS: includes current row + 1 before + 1 after (by position)
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING

-- RANGE: includes values within range (by value)
ORDER BY levels
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING

Önemli farklar:

  • ROWS - satır konumlarına dayalı, her zaman aynı sayıda satır
  • RANGE - değerlere dayalı, aynı değerlere sahip daha fazla satır içerebilir
  • RANGE tarih sütunlarını desteklemez

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