Ich weiß nicht, ob es eine Möglichkeit gibt, eine neue Aggregatfunktion zu definieren, nicht ohne mit dem MySQL-Quellcode herumzuspielen.
Wenn Ihre Zahlen jedoch alle positiv sind, können Sie sich durchaus aus der arithmetischen Identität ableiten:
log( product( Ai ) ) = sum( log( Ai ) )
die Sie verwenden können, um EXP(SUM(LOG(x)))
zu berechnen PRODUCT(x)
. Test in SQL-Fiddle :
SELECT EXP(SUM(LOG(a))) AS product
FROM t ;
SELECT col, EXP(SUM(LOG(a))) AS product
FROM t
GROUP BY col ;
Wenn die Daten Nullen haben können, wird es etwas komplizierter:
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 ;
Getestet bei SQL-Fiddle
Für andere DBMS, die keine automatische Konvertierung von Booleschen Werten in Ganzzahlen durch MySQL haben, ist die
(NOT EXISTS (SELECT ...))
sollte ersetzt werden durch:
(CASE WHEN EXISTS (SELECT 1...) THEN 0 ELSE 1 END)
Speziell für Oracle sind einige weitere Änderungen erforderlich, ohne die Logik der Antwort zu ändern, nur weil Oracle in einigen Bereichen nicht dem strengen ANSI-Standard folgt. Getestet bei SQL-Fiddle-2