SQL window funksiyalar (OVER, PARTITION BY)

GROUP BY qatorlarni yig’ib, guruh uchun bitta natija berardi. Ba’zan esa har qatorni saqlab, ustiga guruh bo’yicha hisob qo’shish kerak bo’ladi — masalan “har mahsulotning o’z toifasidagi o’rni”. Buni window funksiyalar bajaradi.

OVER — qatorni yo’qotmasdan hisoblash

Window funksiya OVER (...) bilan yoziladi. Har mahsulotga toifasidagi o’rnini beramiz:

SELECT nom, turi, narx,
  ROW_NUMBER() OVER (PARTITION BY turi ORDER BY narx DESC) AS orin
FROM mahsulotlar;

O’zingiz ishga tushirib ko’ring — so’rovni tahrirlashingiz ham mumkin:

SQL · namuna baza

Natija — barcha qator saqlanadi, ustiga orin qo’shildi:

nomturinarxorin
Guruchdon180001
Choyichimlik150001
Suvichimlik40002
Bananmeva140001
Olmameva80002
Nonnon30001
Sutsut mahsuloti120001
Qatiqsut mahsuloti90002
  • PARTITION BY turi — hisobni har toifa uchun alohida yuritadi.
  • ORDER BY narx DESC — toifa ichida narx bo’yicha tartiblaydi.
  • ROW_NUMBER() — har qatorga tartib raqami beradi.

Amaliy mashq

Oyna funksiyalarini sinang:

  1. ROW_NUMBER() bilan har toifada narx bo’yicha o’rin bering;
  2. PARTITION BY ni olib tashlang — raqamlash qanday o’zgardi?
  3. RANK() ga almashtiring va farqni kuzating;
  4. SUM(narx) OVER (ORDER BY id) bilan o’suvchi yig’indi hisoblang;
  5. shu natijani GROUP BY bilan olishga urinib ko’ring;
  6. PARTITION BY turi bilan AVG(narx) OVER (...) yozib, har qator yonida o’z toifasining o’rtacha narxini chiqaring.

5-qadam window funksiya va GROUP BY farqini aniq ko’rsatadi.

Qisqacha xulosa

  • Window funksiya qatorlarni yig’masdan, guruh bo’yicha hisob qo’shadi.
  • OVER (...) — funksiyaning “oynasini” belgilaydi.
  • PARTITION BY — oynani guruhlarga bo’ladi; ORDER BY — ichida tartiblaydi.
  • ROW_NUMBER() tartib raqami; RANK(), SUM() OVER ham bor.
  • GROUP BY dan farqi: har qator natijada saqlanadi.

Keyingi darsda CTE (WITH) — murakkab so’rovni nomlangan bo’laklarga bo’lib, o’qishga qulay qilishni ko’ramiz.

Bu dars foydali bo'ldimi?

—
— marta ko'rildi