> Зачем нужен номер строки (row number) в SQL запросах (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Ютека

Стек: Go

> Пример ответа

Номер строки (ROW_NUMBER) в SQL - это оконная функция, которая присваивает уникальный последовательный номер каждой строке в рамках указанного раздела (PARTITION BY) и порядка сортировки (ORDER BY). В Go-разработке, особенно при работе с реляционными базами данных через драйверы (например, database/sql с PostgreSQL или MySQL), ROW_NUMBER решает несколько практических задач:

  1. Пагинация с гарантией уникальности - в отличие от LIMIT/OFFSET, ROW_NUMBER позволяет реализовать "keyset pagination" (пагинацию по курсору). Например, при выборке логов или заказов можно получить следующий блок, отталкиваясь от последнего номера строки, что исключает дубликаты при вставке новых данных между запросами.

  2. Дедупликация - удаление дубликатов, оставляя только первую запись для каждой группы. Например, в Go-сервисе, обрабатывающем события, можно написать:

    SQL
    DELETE FROM events
    WHERE id IN (
    SELECT id FROM (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY event_type, user_id ORDER BY created_at) AS rn
    FROM events
    ) t WHERE rn > 1
    );
  3. Выбор топ-N записей - получение, например, трех последних заказов каждого пользователя. В Go-коде это часто используется для построения дашбордов или отчетов без дополнительной обработки на стороне приложения.

  4. Нумерация для отображения - в UI списках (например, таблица с результатами поиска) ROW_NUMBER дает стабильный порядковый номер, который не сбивается при фильтрации или сортировке на клиенте.

Важно: ROW_NUMBER - оконная функция, поэтому она выполняется после WHERE, GROUP BY и HAVING, но до ORDER BY в основном запросе. В Go это стоит учитывать при построении сложных запросов с использованием ORM (например, GORM) - иногда проще написать сырой SQL, чем полагаться на абстракции.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью