[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-sql-rasskazhite-ob-osnovnykh-funktsiyakh-ranzhirovaniya-v-transact-sql":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},871,"rasskazhite-ob-osnovnykh-funktsiyakh-ranzhirovaniya-v-transact-sql",25,"sql","SQL","🗃️","Расскажите об основных функциях ранжирования в Transact-SQL","Ранжирующие функции возвращают порядковый номер или ранг для каждой записи внутри определённого раздела результирующего набора. Они работают через конструкцию `OVER(ORDER BY ...)` и не сворачивают строки, в отличие от `GROUP BY`.\n\n| Функция | Поведение при одинаковых значениях | Пример результата |\n|---------|----------------------------------|-------------------|\n| `ROW_NUMBER()` | Всегда уникальный номер | 1, 2, 3, 4, 5 |\n| `RANK()` | Одинаковый ранг + пропуск | 1, 2, 2, 4, 5 |\n| `DENSE_RANK()` | Одинаковый ранг без пропуска | 1, 2, 2, 3, 4 |\n| `NTILE(n)` | Делит на n равных групп | 1, 1, 2, 2, 3 |\n\n### ROW_NUMBER\n\nПрисваивает уникальный последовательный номер каждой строке. При одинаковых значениях порядок распределения номеров не определён (недетерминирован).\n\n```sql\nSELECT name, marks,\n       ROW_NUMBER() OVER(ORDER BY marks DESC) AS row_num\nFROM ExamResult;\n```\n\n### RANK\n\nПрисваивает ранг с учётом одинаковых значений. Если две строки имеют одинаковое значение, обе получают одинаковый ранг, а следующий ранг пропускается.\n\n```sql\nSELECT name, marks,\n       RANK() OVER(ORDER BY marks DESC) AS rnk\nFROM ExamResult;\n-- Результат: если 2 строки имеют ранг 2, следующая получит ранг 4\n```\n\n### DENSE_RANK\n\nАналогичен `RANK`, но без пропуска позиций. Если две строки имеют ранг 2, следующая получит ранг 3.\n\n```sql\nSELECT name, marks,\n       DENSE_RANK() OVER(ORDER BY marks DESC) AS dense_rnk\nFROM ExamResult;\n```\n\n### NTILE\n\nДелит строки на `n` примерно равных групп. Полезно для вычисления квартилей, децилей и других статистических разбиений.\n\n```sql\nSELECT name, marks,\n       NTILE(4) OVER(ORDER BY marks DESC) AS quartile\nFROM ExamResult;\n```\n\nВсе функции ранжирования поддерживают `PARTITION BY` для разделения на независимые группы:\n\n```sql\nSELECT name, subject, marks,\n       RANK() OVER(PARTITION BY subject ORDER BY marks DESC) AS rnk\nFROM ExamResult;\n```\n\n> **На собеседовании:** чётко объясните разницу между `RANK` и `DENSE_RANK` (пропуск позиций). Частая ошибка — путать `ROW_NUMBER` и `RANK`: `ROW_NUMBER` всегда уникален, `RANK` может повторяться.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Расскажите об основных функциях ранжирования в Transact-SQL — Gymterview","Ранжирующие функции возвращают порядковый номер или ранг для каждой записи внутри определённого раздела результирующего набора. Они работают через конструкцию `","Ранжирующие функции возвращают порядковый номер или ранг для каждой записи внутри определённого раздела результирующего ",[7,13],"Ранжирующие функции возвращают порядковый номер или ранг для каждой записи внутри определённого раздела результирующего набора. Они работают через конструкцию `OVER(ORDER BY ...)` и не сворачивают строки, в отличие от `GROUP BY`.",true]