Bosh sahifa Wiki Window function

Window function

Window functionSQL natijasidagi har bir satrni saqlagan holda, unga bog‘liq satrlar “oynasi” ustida hisob bajaradigan funksiya. Oddiy aggregate GROUP BY orqali bir nechta satrni bitta qatorga yig‘adi; window function esa ranking, running total, oldingi-keyingi qiymat va guruh ichidagi statistika natijasini har satr yoniga qo‘shadi.

OVER bandi

Window hisobining chegarasi OVER ichida belgilanadi:

SELECT
    customer_id,
    created_at,
    total,
    SUM(total) OVER (
        PARTITION BY customer_id
        ORDER BY created_at, id
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    ) AS running_total
FROM orders;

PARTITION BY satrlarni mustaqil bo‘limlarga ajratadi. Bu yerda har mijozning hisobi alohida boshlanadi. Window ichidagi ORDER BY hisoblash ketma-ketligini belgilaydi. Frame bandi joriy satr uchun qaysi qo‘shni satrlar ishlatilishini aniq ko‘rsatadi.

Ranking va navigatsiya

ROW_NUMBER partition ichida noyob ketma-ket raqam beradi. RANK teng qiymatlarga bir xil rank berib, keyingi raqamda bo‘shliq qoldiradi; DENSE_RANK bo‘shliq qoldirmaydi. Masalan, ballar 100, 100, 90 bo‘lsa, RANK natijasi 1, 1, 3, DENSE_RANK esa 1, 1, 2 bo‘ladi.

LAG oldingi, LEAD keyingi satr qiymatini olishga xizmat qiladi. Bu vaqt qatorida o‘zgarishni hisoblash yoki holatlar orasidagi intervalni topishda qulay. FIRST_VALUE va LAST_VALUE frame semantikasiga bog‘liq; ayniqsa LAST_VALUE default frame sabab butun partitionning oxirini emas, joriy peer guruh oxirini qaytarishi mumkin.

Frame turlari

ROWS fizik satrlar soni bilan, RANGE sort qiymatiga teng peerlar yoki qiymat oralig‘i bilan ishlaydi. GROUPS peer guruhlarini birlik sifatida oladi. Default frame database va mavjud ORDER BYga bog‘liq bo‘lgani uchun running total yoki moving average uchun frame’ni aniq yozish ma’qul.

Moving average misoli:

AVG(value) OVER (
    ORDER BY measured_at
    ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
)

Bu yetti satr o‘rtachasidir; yetti kalendar kun degani emas. Vaqtda uzilish bo‘lsa, vaqt intervaliga mos frame yoki calendar table talab qilinadi.

Bajarilish va filtrlash

Window funksiyalar mantiqan WHERE, GROUP BY va HAVINGdan keyin, yakuniy ORDER BYdan oldin hisoblanadi. Shu sabab window aliasini ko‘pchilik tizimlarda shu queryning WHERE bandida ishlatib bo‘lmaydi. Natijani subquery yoki CTEga joylab, tashqi queryda filtrlash mumkin. Ayrim mahsulotlar buning uchun QUALIFY bandini taklif qiladi.

Samaradorlik

Partition va sort kalitlari bo‘yicha tartiblash katta xarajat keltirishi mumkin. Bir xil window specificationga ega funksiyalar bitta sortdan foydalanishi ehtimoli bor; turli tartiblar esa qo‘shimcha sort talab qiladi. Mos index ayrim hollarda yordam beradi, ammo filter, output hajmi va optimizer qarori ham muhim.

Deterministic natija uchun window ORDER BYida teng qiymatlarni ajratadigan kalit bo‘lishi kerak. Katta partition xotira yoki temporary diskka spill bo‘lishi mumkin. Query plan, real satrlar soni va spill metrikasi tekshiriladi; zarur bo‘lsa vaqt oralig‘i filtri yoki oldindan aggregation qo‘llanadi.

Named window bir xil PARTITION BY va ORDER BY ta’rifini bir nechta funksiyada qayta ishlatadi. Bu queryni o‘qishni yengillashtiradi, lekin engine fizik hisobni albatta bitta bosqichga birlashtiradi degani emas. Turli frame talab qiladigan funksiyalar natijasi test ma’lumotida, ayniqsa duplicate sort kalitlari bilan tekshiriladi.

Bog‘liq tushunchalar

SQL, Aggregate function, PARTITION BY, ROW_NUMBER, RANK, LAG, Window frame, ORDER BY