[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-kakie-osnovnye-okonnye-funktsii-sushchestvuyut-v-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1050,"kakie-osnovnye-okonnye-funktsii-sushchestvuyut-v-postgresql",28,"postgresql","PostgreSQL","🐘","Какие основные оконные функции существуют в PostgreSQL?","PostgreSQL предоставляет ранжирующие функции (ROW_NUMBER, RANK, DENSE_RANK, NTILE) и функции смещения (LAG, LEAD, FIRST_VALUE, LAST_VALUE). Вместе с агрегатными функциями (SUM, AVG, COUNT) в оконном контексте они покрывают большинство аналитических задач.\n\n### Ранжирующие функции\n\n```sql\nSELECT\n    name, department, salary,\n    ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,\n    RANK()       OVER (ORDER BY salary DESC) AS rank,\n    DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank,\n    NTILE(4)     OVER (ORDER BY salary DESC) AS quartile\nFROM employees;\n```\n\n| Функция | Описание | Одинаковые значения |\n|---|---|---|\n| `ROW_NUMBER()` | Уникальный номер строки | Разные номера |\n| `RANK()` | Ранг с пропусками | Одинаковый ранг, следующий с пропуском |\n| `DENSE_RANK()` | Ранг без пропусков | Одинаковый ранг, следующий без пропуска |\n| `NTILE(n)` | Разбивка на n групп | Равномерное распределение |\n\n### Функции смещения\n\n```sql\nSELECT\n    id, amount, created_at,\n    LAG(amount, 1) OVER (ORDER BY created_at) AS prev_amount,\n    LEAD(amount, 1) OVER (ORDER BY created_at) AS next_amount,\n    FIRST_VALUE(amount) OVER (PARTITION BY account_id ORDER BY created_at) AS first_tx,\n    LAST_VALUE(amount) OVER (\n        PARTITION BY account_id ORDER BY created_at\n        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING\n    ) AS last_tx\nFROM transactions;\n```\n\n\u003Cdetails>\u003Csummary>Практические задачи\u003C\u002Fsummary>\n\n```sql\n-- Топ-3 транзакции по каждому счёту\nWITH ranked AS (\n    SELECT *, ROW_NUMBER() OVER (PARTITION BY account_id ORDER BY amount DESC) AS rn\n    FROM transactions\n)\nSELECT * FROM ranked WHERE rn \u003C= 3;\n\n-- Разница с предыдущей транзакцией\nSELECT\n    id, amount,\n    amount - LAG(amount) OVER (ORDER BY created_at) AS diff_with_prev,\n    created_at - LAG(created_at) OVER (ORDER BY created_at) AS time_gap\nFROM transactions\nWHERE account_id = 100;\n\n-- Процент от общей суммы\nSELECT\n    account_id, amount,\n    ROUND(amount * 100.0 \u002F SUM(amount) OVER (), 2) AS pct_of_total,\n    ROUND(amount * 100.0 \u002F SUM(amount) OVER (PARTITION BY account_id), 2) AS pct_of_account\nFROM transactions;\n\n-- Нарастающий итог с ежедневной группировкой\nSELECT\n    date(created_at) AS day,\n    SUM(amount) AS daily_total,\n    SUM(SUM(amount)) OVER (ORDER BY date(created_at)) AS cumulative_total\nFROM transactions\nGROUP BY date(created_at);\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** обязательный вопрос — отличие ROW_NUMBER, RANK, DENSE_RANK на одинаковых значениях. Классическая задача: «топ-N записей в каждой группе» — решается через ROW_NUMBER + PARTITION BY + CTE с фильтром.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие основные оконные функции существуют в PostgreSQL? — Gymterview","PostgreSQL предоставляет ранжирующие функции (ROW_NUMBER, RANK, DENSE_RANK, NTILE) и функции смещения (LAG, LEAD, FIRST_VALUE, LAST_VALUE). Вместе с агрегатными","PostgreSQL предоставляет ранжирующие функции (ROW_NUMBER, RANK, DENSE_RANK, NTILE) и функции смещения (LAG, LEAD, FIRST_",[7,13],"PostgreSQL предоставляет ранжирующие функции (ROW_NUMBER, RANK, DENSE_RANK, NTILE) и функции смещения (LAG, LEAD, FIRST_VALUE, LAST_VALUE). Вместе с агрегатными функциями (SUM, AVG, COUNT) в оконном контексте они покрывают большинство аналитических задач.",true]