Ana içeriğe geç
Modül 7 · Ders 2 ders 4Kurstaki 26/57~14 min
Modül dersleri (2/4)

Pencere işlevleri: sıralamalar ve grup başına hesaplamalar

pencere işlevi bir "satır grubu" üzerinde çalışan bir işlevdir (window) ancak — GROUP BY'dan farklı olarak — sayısını azaltmaz satırlar: pencere üzerinden hesaplanan bir değer, satırın her satırına eklenir. nihai sonuç.

Sıralamalar, aşamalı numaralandırma ve yüzdeler için doğru araçtır bir grup toplamı üzerinde ve garip ya da diğer birçok işlemde GROUP BY ile imkansız.

Söz dizimi: function() OVER (…)

SQL
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)

Bileşenler:

  • PARTITION BY — "grupları" tanımlar (GROUP BY gibi, ancak satırlar ayrı kalın);
  • ORDER BY OVER(…) içinde — içindeki sırayı tanımlar bölüm.

OVER () (boş parantez) "tüm tablonun tek bir pencerede olması" anlamına gelir. "Toplamın yüzdesi" gibi hesaplamalar için kullanışlıdır.

Sıralama işlevleri

SQL
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK()       OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)

Farklılıklar (100, 100, 90, 80 değerleriyle):

İşlevPozisyonlar
ROW_NUMBER1, 2, 3, 4 (her zaman benzersiz)
RANK1, 1, 3, 4 (beraberlikler aynı pozisyonu paylaşır, "boşluk" bırakır)
DENSE_RANK1, 1, 2, 3 (beraberlikler aynı pozisyonu paylaşıyor, boşluksuz)

Örnek: kategoriye göre ürün sıralaması

SQL
SELECT name,
       category_id,
       price,
       RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM   products
ORDER BY category_id, rank;

Her category_id için RANK 1'den yeniden başlar ve azalarak sıralanır fiyat: her kategorideki ürünlerin sıralamasını tek bir kategoride alırsınız vuruldu.

Aşamalı numaralandırma

SQL
-- Progressive order number for each customer:
SELECT id,
       customer_id,
       ordered_at,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM   orders
ORDER BY customer_id, row_num;

Her müşterinin ilk siparişinde row_num = 1, ikinci siparişinde 2 vb. bulunur.

Deneyin

Egzersiz#sql.m7.l2.e1
Denemeler: 0Yükleniyor…

Her ürün için gösteri adı, kategori_kimliği, fiyat ve sıralama (kategori İÇERİSİNDE azalan fiyata göre sıralama; RANK kullanın). Kategori_id değerini artırarak ve sıralamayı artırarak sıralayın.

Düzenleyici yükleniyor…
İpucu göster

PARTITION BYcategory_id grupları, ORDER BY fiyat DESC grup içindeki siparişler.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m7.l2.e2
Denemeler: 0Yükleniyor…

Her sipariş için müşteri_id, sipariş_at ve satır_num'unu gösterin (müşteri başına artan sıralı ROW_NUMBER, artan sipariş_at şeklinde sıralanmıştır). Customer_id ve row_num'a göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

ROW_NUMBER bölüm içinde her zaman benzersizdir.

3 denemeden sonra çözüm mevcut