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.
- Çift sayıda değer varsa medyan ortadaki iki değerin ortalaması mı?
- NULL fiyatlar dahil mi?
- Mod için eşit sıklıkta birden çok değer varsa hepsi mi?
Yaklaşım
- Her grupta değerleri sırala: ROW_NUMBER ile sıra, COUNT OVER ile grup büyüklüğü.
- Ortadaki sıraları seç: tek sayıda (n+1)/2, çift sayıda n/2 ve n/2+1.
- Seçilen değerlerin ortalaması medyandır.
- 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ı
| Durum | Ne olur? |
|---|---|
| Çift sayıda değer | Ortadaki iki değerin ortalaması |
| Tek değerli grup | O değerin kendisi |
| NULL | COUNT(*) yerine COUNT(price) ve WHERE price IS NOT NULL |
| Tam sayı bölmesi farkı | MySQL / Oracle / BigQuery'de FLOOR gerekir |
Takip soruları
- 90. yüzdelik nasıl hesaplanır? (NTILE(10) veya PERCENT_RANK)
- Medyan neden çarpık dağılımlarda ortalamadan daha iyi bir özet?
- Çok büyük veride kesin medyan pahalıysa ne yaparsın? (yaklaşık yüzdelik)
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.