Oyna funksiyalari
1711 daq
GROUP BY qatorlarni bittaga «yig‘ib» qo‘yadi. Oyna funksiyalari esa har bir qatorni o‘z joyida qoldirib, yoniga guruh bo‘yicha hisobni qo‘shadi: o‘rin, o‘sib boruvchi yig‘indi, oldingi qatordagi qiymat.
Qolip
funksiya() OVER (PARTITION BY guruh ORDER BY tartib)PARTITION BY— qaysi guruhlar ichida hisoblash (yozilmasa — butun natija bitta guruh);ORDER BY— guruh ichidagi tartib.
O‘rinlar: ROW_NUMBER, RANK, DENSE_RANK
ROW_NUMBER— 1, 2, 3… teng qiymatlarga ham har xil raqam;RANK— tenglarga bir xil o‘rin, keyingisi sakraydi (1, 1, 3);DENSE_RANK— tenglarga bir xil o‘rin, sakramaydi (1, 1, 2).
Har bir guruh ichida
Har bir fakultetda eng yuqori maoshli ustoz:
Oyna funksiyasini WHERE ichida ishlatib bo‘lmaydi — shuning uchun avval CTE’da hisoblab, keyin filtrlaymiz.
Agregat + OVER: ulush va o‘sib boruvchi yig‘indi
SUM(...) OVER () — butun natija bo‘yicha jami, har bir qator yonida.
Oylar bo‘yicha o‘sib boruvchi tushum:
LAG va LEAD — qo‘shni qator
LAG(x) — oldingi qatordagi qiymat, LEAD(x) — keyingisi. O‘tgan oyga nisbatan o‘zgarish:
Har bir xodimning first_name, last_name, salary ustunlarini va butun kompaniya bo‘yicha oylik o‘rnini (DENSE_RANK, eng yuqori — 1) chiqaring. O‘rin o‘sib borish tartibida.
Har bir talabaning id, first_name ustunlarini va o‘z guruhidagi o‘rnini chiqaring: kim avval o‘qishga kirgan (enrolled_at) — o‘sha birinchi, sana teng bo‘lsa — id kichigi birinchi (ROW_NUMBER, PARTITION BY group_id).
Esda qoldiring
- Oyna funksiyasi qatorlarni yig‘maydi — har bir qator yoniga hisob qo‘shadi.
PARTITION BY— guruh,ORDER BY— tartib.- Natija bo‘yicha filtrlash uchun avval CTE yoki ichki so‘rov kerak.