> Как написать запрос с использованием CTE в SQL (Go)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ютека
Стек: Go
> Пример ответа
CTE (Common Table Expression) - это временный именованный набор результатов, который существует в рамках одного запроса. В Go с драйверами PostgreSQL (например, lib/pq или pgx) CTE работает так же, как в чистом SQL.
Пример: допустим, есть таблица orders (id, user_id, amount, created_at) и нужно получить топ-3 пользователей по сумме заказов за последний месяц.
SQLWITH user_totals AS (SELECTuser_id,SUM(amount) AS total_amountFROM ordersWHERE created_at >= NOW() - INTERVAL '1 month'GROUP BY user_id)SELECTuser_id,total_amountFROM user_totalsORDER BY total_amount DESCLIMIT 3;
В Go-коде это выглядит так:
GOimport ("context""github.com/jackc/pgx/v5/pgxpool")type UserTotal struct {UserID int64Total float64}func GetTopUsers(ctx context.Context, pool *pgxpool.Pool) ([]UserTotal, error) {query := `WITH user_totals AS (SELECTuser_id,SUM(amount) AS total_amountFROM ordersWHERE created_at >= NOW() - INTERVAL '1 month'GROUP BY user_id)SELECT user_id, total_amountFROM user_totalsORDER BY total_amount DESCLIMIT 3`rows, err := pool.Query(ctx, query)if err != nil {return nil, err}defer rows.Close()var result []UserTotalfor rows.Next() {var ut UserTotalif err := rows.Scan(&ut.UserID, &ut.Total); err != nil {return nil, err}result = append(result, ut)}return result, nil}
Ключевые моменты:
-
CTE улучшает читаемость сложных запросов, разбивая их на логические блоки.
-
В Go запрос передаётся как обычная строка - никаких специальных адаптаций не требуется.
-
CTE может быть рекурсивным (с
RECURSIVE), что полезно для иерархических данных (например, дерево категорий).
> Похожие задачи по backend
Оценка знаний по Go
Как происходит выделение памяти для переменных в функции double в Go
Как работает использование нескольких CTE с JOIN в SQL: по индексам или в памяти?
Зачем нужен номер строки (row number) в SQL запросах
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью