Всем привет! С вами Евгений Буторин, ментор курса «Аналитик данных» 👋🏻
Давайте продолжим учиться на чужих ошибках, чтобы не делать свои. Вот несколько функций, которые вызывают сложности у начинающих аналитиков:
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