Мне нужна агрегатная функция, которую MySQL не предоставляет.
Я хотел бы, чтобы он был в разновидности SQL MySQL (то есть, не в C).
Как мне это сделать? То, на чем я застрял, - это создание агрегатной функции - документы , похоже, не упоминают, как это делается.
Примеры желаемого использования product
функции:
mysql> select product(col) as a from `table`;
+------+
| a |
+------+
| 144 |
+------+
1 row in set (0.00 sec)
mysql> select col, product(col) as a from `table` group by col;
+-----+------+
| col | a |
+-----+------+
| 6 | 36 |
| 4 | 4 |
+-----+------+
2 rows in set (0.01 sec)
Я не знаю, есть ли способ определить новую агрегатную функцию, не без возни с исходным кодом MySQL.
Но если все ваши числа положительны, вы можете получить арифметическую идентичность:
что вы можете использовать
EXP(SUM(LOG(x)))
для расчетаPRODUCT(x)
. Тест в SQL-Fiddle :Когда данные могут иметь 0, это становится немного сложнее:
Проверено на SQL-Fiddle
Для других СУБД, которые не имеют автоматического преобразования MySQL логических значений в целые числа,
следует заменить на:
В частности, для Oracle потребуется внести еще несколько изменений, не меняя логику ответа, только потому, что Oracle в некоторых областях не следует строгому стандарту ANSI. Протестировано на SQL-Fiddle-2
источник
product
должен был быть лишь одним примером из нескольких.PRODUCT(..., 0, ...) = 0
, мы хотим этоEXP(SUM(..., f(0), ...)) = 0
для техf
, кого мы выбираем, но чтобы удовлетворить это, нам нужно этоSUM(..., f(0), ...) = LOG(0)
- опять-таки помешано той же проблемой, что log (0 ) не определено. Нам нужно проверить наличие нуля другим способом, напримерMIN(ABS(a)) = 0
. Так что мы бы получилиSELECT CASE WHEN MIN(ABS(a)) = 0 THEN 0 ELSE EXP(SUM(LOG(a))) END AS product
. Вы думали об этом?В интересах научиться ловить рыбу я успешно скомпилировал и установил «Hello, World!» UDF (пользовательская функция) для MySQL находится здесь . Файл hello_world.so (после соблюдения
gcc -shared -o hello_world.so -I /usr/include/mysql hello_world.c
) должен храниться в / usr / lib / mysql / plugins / с разрешениями 755 в системах Ubuntu linux. [-I / usr / include / mysql »- это путь к заголовочным файлам mysql; Я обнаружил, что мой код не будет компилироваться без этого параметра, но YMMV.]Программа ничего не делает, кроме распечатки строки "Hello, World!" для каждой записи в результирующем наборе данных запроса, но это все, что он должен делать. Я постараюсь написать небольшую статистическую функцию в ближайшие несколько дней. Существует пример агрегатной функции, которая вычисляет среднюю стоимость группы записей цены и количества; функция SMALL не должна сильно отличаться от этой функции в конце.
Надеюсь это поможет.
источник