🛠 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;
🤔 А как бы вы оптимизировали запросы?