Ana içeriğe geç
Kesit SQL
Orta · Kanat Havayolları

Pencere fonksiyonları: uçağın günü, rötar zinciri ve sıralamalar

ROW_NUMBER, LAG, DENSE_RANK, hareketli ortalama, FIRST_VALUE ve toplam içindeki pay.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Rötar neden yayılır?

Bir uçak gün içinde birkaç sefer yapar. Önceki sefer geç inerse sonraki sefer de geç kalkabilir: buna rötar zinciri (gec_gelen_ucak) denir. Kanat'ta bir sefer en az 15 dakika geç indiğinde aynı uçağın sonraki seferi %48,0 olasılıkla en az 15 dakika geç kalkıyor; zamanında indiğinde bu oran %32,6. Farkı görmek için aynı uçağın uçuşlarını zaman sırasına koyup bir önceki satıra bakmak gerekir; tam olarak pencere fonksiyonlarının işi.

Veri notuKanat'ta her uçağın konumu izlenebilir: iner, en az 35 dakika (dış hatta 60) yerde kalır, indiği yerden kalkar. Boş geçişler hv_repositioning tablosundadır. Filo seyrek çalıştığı için önceki iniş ile planlanan kalkış arası medyan 472 dakikadır: 342 gec_gelen_ucak satırının yalnız 12'sinde uçak planlanan saatte hazır değildi. Bu neden “önceki sefer geç indi” demektir, tek başına neden-sonuç kanıtı değildir.
SELECT f.tail_no, f.sched_dep, f.flight_no,
       ROUND((julianday(f.actual_dep) - julianday(f.sched_dep)) * 1440) AS gecikme,
       LAG(ROUND((julianday(f.actual_dep) - julianday(f.sched_dep)) * 1440)) OVER (PARTITION BY f.tail_no ORDER BY f.sched_dep, f.flight_id) AS onceki_gecikme
FROM hv_flights f
WHERE f.tail_no = 'TC-KNA'
  AND f.sched_dep >= '2024-12-01' AND f.sched_dep < '2024-12-03'
ORDER BY f.sched_dep;

Sıralama ve pay

SELECT p.tier, ROUND(SUM(b.price)) AS harcama,
       ROUND(100.0 * SUM(b.price) / SUM(SUM(b.price)) OVER (), 1) AS pay
FROM hv_bookings b
JOIN hv_passengers p ON p.passenger_id = b.passenger_id
WHERE b.status = 'flown'
GROUP BY p.tier;

SUM(SUM(b.price)) OVER () ilk bakışta tuhaf görünür: içteki SUM gruplamadan, dıştaki pencereden gelir. Önce her seviyenin toplamı hesaplanır, sonra bu toplamların genel toplamı her satıra yazılır.

PARTITION BY = “her biri için”“Her uçak için sırala”, “her yolcu için ilk rezervasyon” gibi ifadeler PARTITION BY'a karşılık gelir; “zamana göre” ifadesi ise ORDER BY'a.
Alıştırmalara geç (7)