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
будет медленным?