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)
ドキュメントによると http://dev.mysql.com/doc/refman/5.5/en/adding-udf.html Cでのみ集計関数を記述できます。
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でテスト済み
釣り方を学ぶために、「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関数は、最終的にその関数とそれほど異なるものであってはなりません。
お役に立てれば。