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 (…)
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)Bileşenler:
PARTITION BY— "grupları" tanımlar (GROUP BYgibi, ancak satırlar ayrı kalın);ORDER BYOVER(…)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
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):
| İşlev | Pozisyonlar |
|---|---|
ROW_NUMBER | 1, 2, 3, 4 (her zaman benzersiz) |
RANK | 1, 1, 3, 4 (beraberlikler aynı pozisyonu paylaşır, "boşluk" bırakır) |
DENSE_RANK | 1, 1, 2, 3 (beraberlikler aynı pozisyonu paylaşıyor, boşluksuz) |
Örnek: kategoriye göre ürün sıralaması
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
-- 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
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.
İ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
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.
İpucu göster
ROW_NUMBER bölüm içinde her zaman benzersizdir.
3 denemeden sonra çözüm mevcut