TGViewer
Симулейтив Симулейтив @simulative_official · 7.46K subscribers
Post #3227 1.02K
SQL-фишки и ошибки: RANK(), DENSE_RANK(), ROW_NUMBER() и BETWEEN

Всем привет! С вами Евгений Буторин, ментор курса «Аналитик данных» 👋🏻

Давайте продолжим учиться на чужих ошибках, чтобы не делать свои. Вот несколько функций, которые вызывают сложности у начинающих аналитиков:

1️⃣ Разница между RANK(), DENSE_RANK() и ROW_NUMBER()

Эти три функции часто путают, но на самом деле они используются в абсолютно разных ситуациях. Давайте разберёмся:

➖ ROW_NUMBER() присваивает уникальный номер каждой строке, даже если значения одинаковые. Игнорирует дубликаты, просто нумерует по порядку. Применяется, когда нужны уникальные ID для строк, например, для пагинации. Также часто применяется при дедупликации.

Например, нам нужно найти топ-5 продаж по сумме:

SELECT id, product, amount, ROW_NUMBER() OVER (ORDER BY amount DESC) AS rn FROM sales;


В результате, если два товара по 100 рублей, один получит 1, другой 2 и т. д. То есть будет 1, 2, 3. Комбинируйте с CTE или подзапросом для удаления дублей.

➖ RANK() присваивает ранг с учётом дубликатов — одинаковые значения получают один ранг, но следующий пропускается. Применяется, когда важна «ничья», как в спортивных рейтингах или топах с пропусками.

Например, нам нужно определить ранг продуктов по продажам в категории:

SELECT id, product, amount, RANK() OVER (PARTITION BY product ORDER BY amount DESC) AS rank FROM sales;


Результат: если у вас две строки с продажами по 100 рублей, то оба будут иметь ранг 1, а следующий 3. То есть будет 1, 1, 3.

➖ DENSE_RANK() — как RANK, но без пропусков. Дубли получают один ранг, а следующий идёт подряд.

Например, нам нужно определить ранг по датам продаж:

SELECT id, product, date, DENSE_RANK() OVER (ORDER BY date) AS dense_rank FROM sales;


Результат: если у вас 2 ранга выпали на одну дату, то оба будут равны 1, следующий 2 (не 3). То есть будет 1, 1, 2.

2️⃣ BETWEEN
Оператор BETWEEN проверяет, входит ли значение в диапазон. Он применяется для фильтрации дат, чисел, строк:

WHERE date BETWEEN '2023-01-01' AND '2023-12-31'


Например, нам нужно собрать продажи в диапазоне сумм:

SELECT * FROM sales
WHERE amount BETWEEN 50 AND 100;


Результат будет включать и 50, и 100, и все что между ними.

Частые ошибки:
➖ BETWEEN включает оба значения. Если вам не нужно включать оба из них или одно из них, то используйте > и/или <.
➖ Особенности работы с датами и временем. Если данные в витрине указаны с временем (‘2023-01-01 00:00:00’), может between ‘2023-01-01’ пропустить их. Используйте TRUNC(date) или >= AND <.

Надеюсь, что теперь вы знаете, чем отличаются эти функции и когда и как их применять. Ставьте 🔥, если было полезно!

📈 Симулейтив | ВК | YouTube
  • 🔥 17
  • 👍 10
  • ❤ 6
More from @simulative_official
  1. Sep 29, 2026⭐️ Уже сегодня: как ML-инженер учит компьютер находить смысл в тексте Сегодня покажем проф…
  2. Sep 28, 2026#проанализировали_и_поняли
  3. Sep 27, 2026💻💻💻💻💻 Как работает ML-инженер — на примере поиска похожих текстов Пользователь вводит…
  4. Sep 25, 2026Сегодня собираем ETL-пайплайн на данных GitHub — от источника до дашборда Сегодня в 19:00…
  5. Sep 24, 2026💻💻💻💻💻 Собираем ETL-пайплайн на данных GitHub Как данные проходят путь от внешнего сер…
  6. Sep 24, 2026Post #3582
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 →