TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #997 3.87K
🧩 SQL-задача с подвохом (Oracle): рейтинг клиентов по заказам

У тебя есть таблица заказов:


CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
amount NUMBER,
order_date DATE
);


Данные:

| order_id | customer_id | amount | order_date |
|----------|-------------|--------|------------|
| 1 | 101 | 500 | 01-JAN-24 |
| 2 | 102 | 300 | 02-JAN-24 |
| 3 | 103 | NULL | 02-JAN-24 |
| 4 | 101 | 700 | 03-JAN-24 |
| 5 | 102 | NULL | 04-JAN-24 |
| 6 | 104 | 400 | 05-JAN-24 |
| 7 | 103 | 200 | NULL |


🎯 Задача:
Напиши SQL-запрос, который для каждого customer_id вернёт:
• сумму всех заказов (`SUM(amount)`) — учитывай только строки, где amount не NULL
• количество заказов (включая `NULL`-значения)
• рейтинг клиента (`RANK()`), где самый высокий SUM(amount) получает ранг 1
• если у клиента SUM(amount) NULL, он должен получить последний ранг

⚠️ Подвох:
Oracle по умолчанию сортирует NULL в ORDER BY либо вверх, либо вниз в зависимости от ASC или DESC. Это влияет на оконную функцию RANK(). Если не указать NULLS LAST, клиент с NULL в SUM(amount) может получить ранг 1 — что неверно.

💡 Ожидаемый результат:

| customer_id | sum_amount | order_count | rank |
|-------------|------------|-------------|------|
| 101 | 1200 | 2 | 1 |
| 104 | 400 | 1 | 2 |
| 102 | 300 | 2 | 3 |
| 103 | 200 | 2 | 4 |

✅ Решение:

```sql
SELECT
customer_id,
SUM(amount) AS sum_amount,
COUNT(*) AS order_count,
RANK() OVER (
ORDER BY SUM(amount) DESC NULLS LAST
) AS rank
FROM orders
GROUP BY customer_id;
```

🔍 Почему это работает:
•
SUM(amount) автоматически пропускает NULL, то есть считает только валидные суммы
•
COUNT(*) считает все строки, даже с NULL
•
RANK() сортирует по убыванию суммы, а NULLS LAST гарантирует, что клиенты без суммы окажутся в конце рейтинга

📌 Вывод:
Даже опытные аналитики иногда забывают, что
RANK() чувствителен к NULL и что Oracle требует явного указания NULLS LAST, чтобы избежать неочевидных ошибок.

➡ SQL Community | Чат
  • 👍 8
  • ❤ 3
  • 🔥 2
  • 🥱 1
  • 🤨 1
More from @databases_tg
  1. Oct 2, 2026Как SQLite превращает числа в текст в 2 раза быстрее? Трюк с парами цифр Обычно число пере…
  2. Oct 2, 2026В субботу, 17 октября, Москва станет точкой притяжения для всех специалистов в области Rec…
  3. Oct 1, 2026Жиз
  4. Sep 30, 2026📝 5 уровней ИИ-агентов: от промпта до продакшена Context, loop, Jev, harness и evals: раз…
  5. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  6. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
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 →