TGViewer
Level Up в аналитике Level Up в аналитике @levelup_analytics · 97 subscribers
Post #50 123
Разберу одну SQL-задачу, на которой спотыкаются даже те, кто уверенно пишет оконные функции.

Звучит безобидно: «выведи 3 самых дорогих товара в каждой категории».
Большинство пишет сразу: ROW_NUMBER() OVER (PARTITION BY category ORDER BY price DESC) — и фильтр rn <= 3. Запрос работает, можно сдавать?
Не совсем. Есть вопрос, который отличает уверенное решение: а что делать с ничьими?

Представь: в категории четыре товара по 1000 ₽. ROW_NUMBER пронумерует их 1, 2, 3, 4 — и четвертый в топ не попадет. Какой именно не попадет? Случайный. При следующем запуске — возможно, другой. Для отчета, на который смотрят люди, это тихая бомба.

У оконных функций три способа нумеровать, и ведут они себя по-разному:
— ROW_NUMBER: 1, 2, 3, 4. Ничьих не существует, порядок внутри ничьей не определен.
— RANK: 1, 1, 1, 1, 5. Ничьи получают один ранг, следующий — с пропуском.
— DENSE_RANK: 1, 1, 1, 1, 2. То же, но без пропусков.

Правильного ответа нет — есть правильное уточнение. «Ровно 3 строки» — это ROW_NUMBER, но тогда добавь в ORDER BY еще и id, чтобы результат был воспроизводимым. «Все товары трех самых высоких цен» — DENSE_RANK <= 3. «Топ-3 с честными местами, как в спорте» — RANK.

На собесе вопрос «а что с ничьими?» часто стоит больше, чем идеальный синтаксис. Потому что это вопрос человека, который уже ловил такие баги в проде.

И в реальной работе все то же самое: молчаливый ROW_NUMBER в отчете — это случайно выпавшая строка, которую никто не заметит. Пока она не окажется чьим-то товаром.
  • ❤ 4
More from @levelup_analytics
  1. Sep 22, 2026После JOIN выручка выросла, хотя продаж больше не стало Иногда для роста выручки достаточн…
  2. Sep 17, 2026Сто решённых задач могут не сдвинуть тебя с места Поймал себя на знакомой ловушке. Открыва…
  3. Sep 15, 2026Конверсия 3%. Можно ли ей верить? Недавно по работе мне понадобилось рассчитать минимальну…
  4. Sep 8, 2026Я тут пропал на пару недель, но виной тому не только работа. Долго думал как улучшить и си…
  5. Aug 26, 2026В продуктовом кейсе финальная гипотеза это только часть ответа. Во многих командах интервь…
  6. Aug 26, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →