🛠 SQL-лайфхаки

Часто на собесах и в работе всплывают задачи, которые кажутся простыми, пока не начинаешь писать пятиэтажные вложенные запросы. Собрал два приема, которые я сам постоянно использую, чтобы код оставался чистым и быстрым.

1️⃣ Как вытащить самый свежий статус из таблицы Есть таблица с логами платежей. Каждый раз, когда статус меняется (от создан до оплачен), в базу летит новая строка с updated_at. Как вытянуть только актуальное состояние по каждому платежу?

Обычно самое первое, что хочется сделать - это нагородить GROUP BY с джойнами. Но оконки делают это напрого проще и элегантнее:

SELECT * FROM ( SELECT *, MAX(updated_at) OVER (PARTITION BY payment_id) AS last_update FROM payments ) t WHERE updated_at = last_update;

Мы не схлопываем данные через группировку, а просто помечаем таймстемп последней активности для каждой группы. Если нужно вывести не только дату, но и саму сумму платежа или комментарий.

2️⃣ Сводные таблицы Допустим, нам нужно посчитать количество фильмов разной длительности в разрезе годов. Вместо того чтобы делать три отдельных запроса и склеивать их используем конструкцию SUM(CASE...)

SELECT release_year, SUM(CASE WHEN length < 90 THEN 1 ELSE 0 END) AS short_films, SUM(CASE WHEN length >= 90 AND length < 120 THEN 1 ELSE 0 END) AS middle_films, SUM(CASE WHEN length >= 120 THEN 1 ELSE 0 END) AS long_films FROM films GROUP BY 1 ORDER BY 1;

🤔 А как бы вы оптимизировали запросы?