web-dev-qa-db-ja.com

ユーザー定義の集計関数を作成するにはどうすればよいですか?

MySQLが提供していない集約関数が必要です。

MySQLのSQLフレーバー(つまり、Cではない)にしたいのですが。

どうすればよいですか?私が行き詰まっているのは、集約関数の作成です- docs は、これがどのように行われるかについて言及していないようです。

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)
8
Matt Fenwick

ドキュメントによると http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html Cでのみ集計関数を記述できます。

7
Colin 't Hart

MySQLのソースコードをいじらないと、新しい集計関数を定義する方法があるかどうかわかりません。

しかし、数値がすべて正であれば、算術的同一性から派生する可能性があります。

_log( product( Ai ) ) = sum( log( Ai ) )
_

EXP(SUM(LOG(x)))を使用してPRODUCT(x)を計算できます。 SQL-Fiddle でテスト:

_SELECT EXP(SUM(LOG(a))) AS product
FROM t ;

SELECT col, EXP(SUM(LOG(a))) AS product
FROM t 
GROUP BY col ;
_

データに0が含まれる可能性がある場合は、少し複雑になります。

_SELECT (NOT EXISTS (SELECT 1 FROM t WHERE a = 0)) 
       * EXP(SUM(LOG(a))) AS p
FROM t 
WHERE a > 0 ;

SELECT d.col, 
       (NOT EXISTS (SELECT 1 FROM t AS ti WHERE ti.col = d.col AND ti.a = 0)) 
       * COALESCE(EXP(SUM(LOG(t.a))),1)  AS p
FROM 
    ( SELECT DISTINCT col
      FROM t
    ) AS d
  LEFT JOIN
    t  ON  t.col = d.col
       AND t.a > 0
GROUP BY d.col ;
_

SQL-Fiddleでテスト済み


MySQLのブール値の整数への自動変換を持たない他のDBMSの場合、

_(NOT EXISTS (SELECT ...))
_

置き換えられるべきです:

_(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END) 
_

特にOracleの場合、回答のロジックを変更せずに、さらにいくつかの変更が必要になります。これは、Oracleが一部の領域で厳密なANSI標準に従っていないためです。 SQL-Fiddle-2でテスト済み

9
ypercubeᵀᴹ

釣り方を学ぶために、「Hello、World!」をコンパイルしてインストールしました。 MySQLのUDF(ユーザー定義関数) ここにあります 。 hello_world.soファイル(gcc -shared -o hello_world.so -I /usr/include/mysql hello_world.cに準拠した後)は、Ubuntu Linuxシステムでは755権限で/ usr/lib/mysql/plugins /に保存する必要があります。 [「-I/usr/include/mysql」は、mysqlヘッダーファイルへのパスです。私のコードはこのパラメーターなしではコンパイルできないが、YMMVであることがわかりました。]

プログラムは文字列「Hello、World!」を出力するだけです。クエリの結果のデータセット内の各レコードに対して、しかしそれはそれが行うことになっているすべてです。今後数日でSMALL集約関数を作成するように努めます。価格と数量のレコードのグループの平均コストを計算する集計関数の例があります。 SMALL関数は、最終的にその関数とそれほど異なるものであってはなりません。

お役に立てれば。

3
Jeffrey Rolland