我需要一个 MySQL 不提供的聚合函数。
我希望它具有 MySQL 的 SQL 风格(也就是说,不是 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 将布尔值自动转换为整数的 DBMS,
应替换为:
特别是对于Oracle,需要再做一些更改,而不改变答案的逻辑,只是因为Oracle在某些方面没有遵循严格的ANSI标准。在SQL-Fiddle-2测试
根据文档http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html只能用 C 编写聚合函数。对不起!
出于学习钓鱼的兴趣,我已经成功编译并安装了一个“Hello, World!”。在这里找到MySQL 的 UDF(用户定义函数)。hello_world.so 文件(在遵守之后
gcc -shared -o hello_world.so -I /usr/include/mysql hello_world.c
)应该存储在 /usr/lib/mysql/plugins/ 中,在 Ubuntu linux 系统上具有 755 权限。[“-I /usr/include/mysql”是mysql头文件的路径;我发现如果没有这个参数,我的代码将无法编译,但是 YMMV。]程序什么也不做,只是打印出字符串“Hello, World!”。对于查询的结果数据集中的每条记录,但这就是它应该做的一切。在接下来的几天里,我将尝试编写一个 SMALL 聚合函数。有一个聚合函数的例子,它计算一组价格和数量记录的平均成本;SMALL 函数最终不应该与那个函数有那么大的不同。
希望这可以帮助。
从技术上讲,它不是用户定义的聚合函数,也不是最优的,但这可以工作并且不需要创建 UDF:
GROUP_CONCAT()
在您的查询中使用这将使您的查询成为一个聚合函数,并将所有值合并到一个逗号分隔的字符串中,并且然后编写一个处理该字符串的 SQL 函数。示例(基于此答案的功能)::
药片:
询问:
将翻译为:
对于这个特定的自定义函数将返回哪个
my two cents