Веб-версияОткрыть в Telegram

Пост💡 SQL-задача: почему запрос возвращает НЕПРАВИЛЬНЫЙ результат?

3 сентября 2026
D
Data Science. SQL hub
💡 SQL-задача: почему запрос возвращает НЕПРАВИЛЬНЫЙ результат? Есть таблица платежей: CREATE TABLE payments ( user_id BIGINT, paid_at TIMESTAMP, amount NUMERIC ); Нужно найти последний платёж каждого пользователя. Разработчик пишет: SELECT user_id, MAX(paid_at) AS paid_at, amount FROM payments GROUP BY user_id; В некоторых СУБД запрос вообще не выполнится. А в тех, где выполнится, amount может оказаться вообще НЕ от последнего платежа. Почему? Потому что MAX(paid_at) вычисляется отдельно, а amount не обязан принадлежать той же строке. Например: user_id | paid_at | amount --------+--------------------+------- 1 | 2026-01-01 10:00 | 100 1 | 2026-02-01 10:00 | 900 Можно получить: 1 | 2026-02-01 10:00 | 100 Дата последняя, а сумма - от другой строки. Правильный вариант в PostgreSQL: SELECT DISTINCT ON (user_id) user_id, paid_at, amount FROM payments ORDER BY user_id, paid_at DESC; Или универсально через оконную функцию: SELECT user_id, paid_at, amount FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY user_id ORDER BY paid_at DESC ) AS rn FROM payments ) t WHERE rn = 1; Но тут есть ещё одна ловушка. Что будет, если у пользователя два платежа с одинаковым paid_at? Тогда результат становится недетерминированным. • Нужно добавить tie-breaker: ORDER BY paid_at DESC, id DESC Вот уже хороший вопрос для собеседования: Как получить последнюю строку из группы так, чтобы результат был детерминированным даже при одинаковых timestamp?
29 · 4.3K ·

Рядом в ленте

DData Science. SQL hubМы все еще здесь !DData Science. SQL hub⚡️ MongrelDB-V - клиент для MongrelDB на языке V. Сам MongrelDB - open-source колоночная база на Rust с довольно необычным набором возможностей: - SQL через Dat
это сообщение
DData Science. SQL hubФотографияDData Science. SQL hub🧠 Как обучить нейросеть на Python с нуля Пошаговый разбор полного процесса: * подготовка и разделение данных * создание архитектуры модели * выбор функции потер

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем