Запрос в условии уже считает записи status='OK' за последние семь дней по каждому user_id и сортирует по убыванию количества. Пользователи без подходящих записей не выводятся.
-- Есть данные с полями user_id, status и created_at.
Запрос в условии уже считает записи status='OK' за последние семь дней по каждому user_id и сортирует по убыванию количества. Пользователи без подходящих записей не выводятся.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-- Есть данные с полями user_id, status и created_at. -- Напишите SQL-запрос, который считает успешные запросы каждого пользователя за последние 7 дней и сортирует результат по количеству по убыванию. -- Успешный статус - OK
CREATE TABLE user_requests ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL, status VARCHAR(50) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL );
SELECT user_id, COUNT(*) AS successful_count FROM user_requests WHERE status = 'OK' AND created_at >= CURRENT_TIMESTAMP - INTERVAL '7 days' GROUP BY user_id ORDER BY successful_count DESC;
Ответ
Запрос в условии уже считает записи status='OK' за последние семь дней по каждому user_id и сортирует по убыванию количества. Пользователи без подходящих записей не выводятся.
GROUP BY объединяет события пользователя, COUNT(*) считает строки. Для детерминированного порядка при равенстве добавьте user_id в ORDER BY. Если в данных возможны будущие даты, задайте верхнюю границу created_at <= CURRENT_TIMESTAMP. Уточните смысл периода: семь календарных дней и ровно 168 часов могут различаться при смене часового пояса/DST.