🗒 Как посчитать произведение в SQL, если есть только SUM — разберем задачу с собеседования:
Иногда на собеседовании спрашивают:
“Вот у тебя есть таблица транзакций за день. Для каждого дня посчитай произведение значений. Что будешь делать?”
Это решается чисто через математику и стандартные агрегаты. Сейчас разберёмся по шагам.
Представим таблицу transactions:
| tx_date | value |
|------------|-------|
| 2025-10-01 | 2 |
| 2025-10-01 | 3 |
| 2025-10-01 | 5 |
| 2025-10-02 | 4 |
| 2025-10-02 | 2 |
Задача: для каждого дня посчитать произведение всех value.
То есть:
• для 2025-10-01 должно получиться 2⋅3⋅5=30
• для 2025-10-02 должно получиться 4⋅2=8
Как из суммы сделать произведение? 🧠
Вспоминаем школьную математику:
• log(a⋅b)=log(a)+log(b)
Переводя на человеческий язык, чтобы получить произведение, можно:
• взять логарифм каждого числа
• сложить
• применить экспоненту и получить итоговый результат
Решение в SQL 🔵
SELECT
tx_date,
EXP(SUM(LN(value))) AS product_value
FROM transactions
GROUP BY tx_date
ORDER BY tx_date;
Что тут происходит:
• LN(value) — считаем натуральный логарифм каждого значения.
• SUM(LN(value)) — агрегируем по дню.
• EXP(…) — возвращаемся из логарифмического мира к исходному числу.
В итоге получаем то самое произведение.
Важные нюансы, о которых любят спрашивать 🧐
1️⃣Нули:
• Если есть хотя бы один 0, то произведение за день должно быть 0.
• Но ln(0) не существует — будет ошибка.
• Как обойти:
— либо заранее проверять наличие нулей
— либо аккуратно обрабатывать условием
2️⃣Отрицательные значения:
• ln(x) определён только для x>0.
• Если в данных возможны отрицательные значения — задача усложняется:
— нужно отдельно считать знак (чётность количества отрицательных)
— логарифм брать от модуля
— восстанавливать знак в конце.
• На собеседованиях чаще всего ожидают решение для положительных чисел и аккуратную оговорку про этот кейс — если вы про него скажете, это плюс.
Итог:
Такое решение показывает на собеседовании не только знание SQL, но и умение опираться на математику и аккуратно думать про крайние случаи — нули и отрицательные значения.
🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ Сталкивались с задачами на “продвинутые” агрегаты в SQL (медиана, произведение, перцентили)? Пишите в комментариях, что вызывало сложности — постараюсь разобрать в следующих постах.
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
Сделал сайт - оцените:
🚬 Вопросы, обучение, консультации