TGViewer
Data Science. SQL hub Data Science. SQL hub @sqlhub · 36K subscribers
Post #2480 3.92K
💡 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?
  • 🔥 9
  • ❤ 5
  • 👍 4
  • 🥰 1
  • 😁 1
More from @sqlhub
  1. Sep 21, 2026🧩 Сложная SQL-задача: симуляция DNS-кеша Есть таблица запросов: CREATE TABLE dns_requests…
  2. Sep 18, 2026🔥 PostgreSQL 19 задерживается релиз может сдвинуться на несколько недель или даже месяцев…
  3. Sep 17, 2026Участвуй во всероссийском ИТ-чемпионате МТС True Tech Champ 2026 c призовой фондом 10 250…
  4. Sep 17, 2026📌 NY Post: Anthropic - это культ Профессор Вашингтонского университета Педро Домингос в и…
  5. Sep 16, 2026Post #2492
  6. Sep 16, 2026Стать специалистом по Data Science всего за 10 недель — это реально! Если давно смотрите в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →