В PostgreSQL произведение можно вычислить рекурсивным CTE с аккумулятором numeric. Это сохраняет знак и корректно обрабатывает нули без логарифмов.
Есть таблица с набором чисел. Выведите (можно через select) произведение этих чисел
В PostgreSQL произведение можно вычислить рекурсивным CTE с аккумулятором numeric. Это сохраняет знак и корректно обрабатывает нули без логарифмов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Есть таблица с набором чисел. Выведите (можно через select) произведение этих чисел
[phone]
Ответ
В PostgreSQL произведение можно вычислить рекурсивным CTE с аккумулятором numeric. Это сохраняет знак и корректно обрабатывает нули без логарифмов.
Предположим, числа находятся в numbers(num):
WITH RECURSIVE ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY num) AS rn,
num::numeric AS num
FROM numbers
WHERE num IS NOT NULL
), product(i, value) AS (
SELECT 0::bigint, 1::numeric
UNION ALL
SELECT o.rn, p.value * o.num
FROM product p
JOIN ordered o ON o.rn = p.i + 1
)
SELECT value AS product
FROM product
ORDER BY i DESC
LIMIT 1;
NULL игнорируются, пустой набор даёт 1. Это учебное решение; для больших таблиц эффективнее специализированный агрегат. При ограниченных числовых типах учитывают переполнение, а при floating point — погрешность.