# SQL window funksiyalar (OVER, PARTITION BY)

> SQL window funksiyalar: ROW_NUMBER, RANK va OVER bilan qatorlarni yig'masdan hisoblash. PARTITION BY orqali guruh ichida tartiblash va o'rin berish.

Manba: https://learncode.uz/sql/window-funksiyalar/
Sana: 2026-06-20

[`GROUP BY`](https://learncode.uz/sql/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:

```sql
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
SELECT nom, turi, narx,
  ROW_NUMBER() OVER (PARTITION BY turi ORDER BY narx DESC) AS orin
FROM mahsulotlar;
```

Natija — barcha qator saqlanadi, ustiga `orin` qo'shildi:

| nom | turi | narx | orin |
|---|---|---|---|
| Guruch | don | 18000 | 1 |
| Choy | ichimlik | 15000 | 1 |
| Suv | ichimlik | 4000 | 2 |
| Banan | meva | 14000 | 1 |
| Olma | meva | 8000 | 2 |
| Non | non | 3000 | 1 |
| Sut | sut mahsuloti | 12000 | 1 |
| Qatiq | sut mahsuloti | 9000 | 2 |

- `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.

> **Atama**
>
> **Window funksiya** — qatorlar guruhi ("oyna") bo'yicha hisoblaydi, lekin
> `GROUP BY` dan farqli — qatorlarni **yig'ib yubormaydi**. Har qator o'z
> joyida qoladi, natijaga qo'shimcha ustun qo'shiladi. `PARTITION BY` oynani
> guruhlarga bo'ladi.

> **Yodda tuting**
>
> `ROW_NUMBER()` doim 1, 2, 3 beradi. Uning yaqinlari: `RANK()` — bir xil
> qiymatga bir xil o'rin beradi (keyin sakraydi), `SUM(...) OVER (...)` — o'suvchi
> yig'indi (running total). Window funksiyalar SQLite'da 3.25 (2018) versiyadan
> qo'llab-quvvatlanadi.

## 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`)](https://learncode.uz/sql/cte) — murakkab so'rovni nomlangan
bo'laklarga bo'lib, o'qishga qulay qilishni ko'ramiz.
