TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #1388 2.44K
SQL-задача с подвохом посложнее

Нужно найти пользователей, у которых последний заказ был оплачен.

Есть таблица:


orders
id | user_id | status | created_at
1 | 10 | paid | 2026-01-01
2 | 10 | cancelled | 2026-01-05
3 | 20 | paid | 2026-01-03
4 | 30 | failed | 2026-01-02


Кто-то пишет так:


WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY created_at DESC
) AS rn
FROM orders
WHERE status = 'paid'
)
SELECT *
FROM ranked
WHERE rn = 1;


На вид логично. Но запрос неверный.

Подвох: фильтр WHERE status = 'paid' срабатывает до ROW_NUMBER().

То есть SQL сначала выбрасывает все неоплаченные заказы, а потом ищет последний среди оставшихся оплаченных.

Пользователь 10 попадёт в результат, хотя его реальный последний заказ — cancelled.

Правильно так:


WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY created_at DESC, id DESC
) AS rn
FROM orders
)
SELECT *
FROM ranked
WHERE rn = 1
AND status = 'paid';


Сначала находим последний заказ вообще, и только потом проверяем его статус.

Вот почему порядок фильтрации в SQL может полностью менять смысл запроса.
  • 👍 11
  • ❤ 1
  • 💯 1
More from @databases_tg
  1. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  2. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
  3. Sep 25, 2026Как облегчить работу ИТ-аналитика уже сейчас — без долгосрочных перестроек процессов? Обсу…
  4. Sep 24, 2026🐧 Linux Cheat Sheet - шпаргалка по командам Linux Самая удобная шпаргалка по Linux и Bash…
  5. Sep 23, 2026⚡️ SQL-задача с подвохом Что вернёт этот запрос в PostgreSQL? CREATE TABLE payments ( id i…
  6. Sep 17, 2026🖥 Race condition в SQL: как продать последний товар дважды? Race condition в SQL: Дио и Д…
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 →