Pelajaran 35 / 37 · Window function

Membuat peringkat, lalu menyaringnya dengan QUALIFY

CTE menghitung total terlebih dulu (buka di atas query utama). Setelah join, rank() dihitung, lalu QUALIFY menyimpan lima teratas. WHERE tidak bisa melakukannya karena berjalan sebelum window function dihitung. Sebagian besar database lain tidak punya QUALIFY; di sana, query-nya dibungkus dulu, lalu ranking disaring dengan WHERE di query luar.

Query-nya

WITH totals AS (
  SELECT customer_id, sum(amount) AS total
  FROM orders
  WHERE status = 'paid'
  GROUP BY customer_id
)
SELECT c.name, t.total,
       rank() OVER (ORDER BY t.total DESC) AS ranking,
       round(100.0 * t.total / sum(t.total) OVER (), 1) AS pct
FROM totals t
JOIN customers c ON c.id = t.customer_id
QUALIFY ranking <= 5
ORDER BY ranking

Coba dense_rank(): Alice menjadi 2, bukan 3, karena dense_rank tidak melompati angka setelah nilai seri, dan Bob masuk lima besar.

Berikutnya: Menyimpan satu baris per grup dengan ROW_NUMBER · Semua pelajaran