💪 SQL Gym Pro 8 - разбор Под предыдущим постом в комментариях прилетел резонный вопрос: « Почему в таблице нет записи с минусом, если баллы сгорели?»

В реальных больших системах (как Uber, Ozon или Wildberries) транзакций миллионы. Если у каждой записи менять статус с «активен» на «сгорел», базе данных придется постоянно искать и обновлять старые строки. Это очень ресурсозатратно.

Поэтому проще всего использовать расчетную логику: 1. У нас есть «сырые» данные (кто, когда и сколько получил). 2. Мы пишем SQL-запрос, который на лету спрашивает: «Так, этой записи больше 30 дней? Игнорируем её».

Разбор решения Чтобы получить верный баланс, нам нужно отфильтровать данные по двум условиям: 1. Взять все списания (потому что они уже случились). 2. Взять начисления только за последние 30 дней. SELECT user_id, -- Считаем сумму только по нужным критериям SUM(CASE -- Начисления берем только если им меньше 30 дней WHEN amount > 0 AND created_at >= '2026-02-06'::date - INTERVAL '30 days' THEN amount -- Списания берем абсолютно все WHEN amount < 0 THEN amount ELSE 0 END) AS active_balance FROM transactions GROUP BY user_id;

🚩 Главная ловушка Многие пытаются просто отфильтровать всю таблицу через WHERE created_at > .... Но тогда вы потеряете старые списания! Баланс получится завышенным, потому что вы не учтете, что юзер мог потратить баллы месяц назад.