Есть ли опыт работы с оконными функциями и ранжированием (row_number, rank, over)
Что проверяют
Может ли тестировщик сам проверить данные в базе, а не ждать разработчика: найти дубли, взять последнюю запись по каждому объекту, сверить ранжирование в отчёте. Следом почти всегда просят объяснить разницу между ROW_NUMBER, RANK и DENSE_RANK или написать запрос «топ-3 в каждой группе» прямо на собеседовании.
Как отвечать
Коротко скажите, где применяли, и покажите, что понимаете механику:
OVER: это не функция, а описание окна.PARTITION BYделит строки на группы, но, в отличие отGROUP BY, не схлопывает их, каждая строка остаётся в результате.ORDER BYвнутри задаёт порядок в окне;ROW_NUMBER(): сквозной номер без повторов, при равных значениях порядок между ними произвольный;RANK(): у равных одинаковый ранг, дальше пропуск: 1, 1, 3;DENSE_RANK(): у равных одинаковый ранг без пропуска: 1, 1, 2;- агрегаты и смещения:
SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at)даёт нарастающий итог,LAGиLEADберут значение из предыдущей или следующей строки.
Задачи из практики QA: найти дубли заказов через ROW_NUMBER() OVER (PARTITION BY external_id ORDER BY created_at) и отобрать строки с номером больше 1; проверить, что последний статус заказа совпадает с тем, что отдаёт API; через LAG убедиться, что статусы не перескакивают через обязательный шаг.
Если опыта нет, так и скажите: уверенно пишете JOIN и GROUP BY, про оконные функции знаете и готовы написать запрос сейчас. И действительно напишите.
Где спотыкаются
Фильтруют по оконной функции в WHERE. Она вычисляется после WHERE и GROUP BY, поэтому номер строки сначала считают в подзапросе или CTE, а условие rn <= 3 пишут снаружи.
Берут ROW_NUMBER для «топ-3 по продажам», когда важны равные значения. Товар с тем же результатом, что у третьего, молча выпадет, а нужен был RANK или DENSE_RANK.
Сортируют окно по неуникальному полю. ROW_NUMBER на одинаковых датах от запуска к запуску выдаёт разный порядок, и автотест, сверяющий результат, становится нестабильным. Добавьте в ORDER BY второе поле, например id.