SO,
Проблема
У меня проблема с умножением строк. В SQL существует функция SUM(), которая вычисляет сумму для некоторого поля для набора строк. Я хочу получить умножение, т.е. Для таблицы
+------+ | data | +------+ | 2 | | -1 | | 3 | +------+
который будет 2*(-1)*3 = -6 в результате. Я использую тип данных DOUBLE для хранения моих значений данных.
Мой подход
Из школьной математики известно, что log(A x B) = log(A) + log(B) - так, чтобы можно было использовать для создания желаемого выражения, например:
SELECT
IF(COUNT(IF(SIGN(`col`)=0,1,NULL)),0,
IF(COUNT(IF(SIGN(`col`)<0,1,NULL))%2,-1,1)
*
EXP(SUM(LN(ABS(`col`))))) as product
FROM `test`;
- вы видите слабость этого метода - поскольку log(X) есть undefined, когда X<=0 - мне нужно подсчитать отрицательные знаки перед вычислением целого выражения. Пример данных и запросов для этого дается в этой скрипте.
Еще одна слабость заключается в том, что нам нужно найти, если в столбцах есть 0 (поскольку это образец, в реальной ситуации я собираюсь выбрать продукт для некоторого подмножества строк таблицы с некоторым условием (состояниями) - т.е. я не могу просто удалите 0-s из моей таблицы, потому что результат нулевой продукт является допустимым и ожидаемым результатом для некоторых подмножеств строк)
Особенности
И теперь, наконец, мой основной вопрос: как обрабатывать ситуацию, когда у нас есть выражение типа: X*Y*Z и здесь X < MAXF, Y<MAXF, но X*Y>MAXF и X*Y*Z<MAXF - поэтому у нас есть возможные данные type overflow (здесь MAXF является лимитом для двойного типа данных MySQL). Образец здесь. Запрос выше работает хорошо, но могу ли я всегда быть уверенным, что он справится с этим должным образом? То есть может быть, есть еще один случай с проблемой переполнения, когда некоторые подпрограммы вызывают переполнение, но весь продукт в порядке (без переполнения).
Или может быть другой способ найти файл строк? Кроме того, в таблице могут быть миллионы записей (-1.1<X<=1.1 в основном, но, вероятно, с такими значениями, как 100 или 1000 - т.е. достаточно высокий, чтобы переполнить DOUBLE, если умножить на определенное количество, если у нас есть проблема, о которой я уже говорил выше) может быть вычисление через log будет медленным?