Ana içeriğe geç
Kesit SQL
İleri · Mülakat Hazırlığı

Mülakat kalıbı: medyan, yüzdelik ve mod

SQL türünden bağımsız medyan hesabı, grup başına medyan, en sık değer ve yüzdelik dilimler.

Uygulamada aç, 6 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ç.

Soru

Görüşmeci“Her kategoride ürün fiyatlarının medyanını hesapla. MEDIAN fonksiyonu kullanma.” Takip: “En sık görülen sipariş tutarı aralığı (mod) hangisi?”

Önce netleştir

Kod yazmadan önce sorulacak sorular. Her biri farklı bir sorguya götürür; sormamak en sık puan kaybıdır.

Yaklaşım

  1. Her grupta değerleri sırala: ROW_NUMBER ile sıra, COUNT OVER ile grup büyüklüğü.
  2. Ortadaki sıraları seç: tek sayıda (n+1)/2, çift sayıda n/2 ve n/2+1.
  3. Seçilen değerlerin ortalaması medyandır.
  4. Mod: GROUP BY değer, COUNT, en yüksek sayıyı RANK ile seç.

Çözüm 1: ROW_NUMBER ile taşınabilir medyan

WITH s AS (
  SELECT category, price,
         ROW_NUMBER() OVER (PARTITION BY category ORDER BY price) AS rn,
         COUNT(*) OVER (PARTITION BY category) AS n
  FROM products
)
SELECT category, ROUND(AVG(price), 2) AS medyan
FROM s
WHERE rn IN ((n + 1) / 2, (n + 2) / 2)
GROUP BY category
ORDER BY category;

Çözüm 2: SQL türünün yerleşik fonksiyonu (destekleniyorsa)

-- PostgreSQL, Oracle, SQL Server 2022:
-- PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY price)
-- BigQuery: APPROX_QUANTILES(price, 2)[OFFSET(1)]  (yaklaşık)
SELECT category, MEDIAN(price) AS medyan   -- Oracle ve bu uygulama
FROM products
GROUP BY category
ORDER BY category;

Birinci çözümün püf noktası (n + 1) / 2 ve (n + 2) / 2 ifadeleridir: tam sayı bölmesiyle n tekken ikisi de ortadaki sırayı, n çiftken ortadaki iki sırayı verir. Bu ifade MySQL, Oracle ve BigQuery'de ondalıklı bölündüğü için orada FLOOR ile sarılmalıdır. Mülakatta yerleşik fonksiyonu bildiğini söyle, ama genellikle elle yazmanı isterler.

Sınır durumları

DurumNe olur?
Çift sayıda değerOrtadaki iki değerin ortalaması
Tek değerli grupO değerin kendisi
NULLCOUNT(*) yerine COUNT(price) ve WHERE price IS NOT NULL
Tam sayı bölmesi farkıMySQL / Oracle / BigQuery'de FLOOR gerekir

Takip soruları

Görüşmeci neye bakıyor?Tek ve çift sayıda değeri tek bir koşulla ele alman ve tam sayı bölmesinin SQL türlerine göre farkını bilmen.
Alıştırmalara geç (6)