当有Sum(),min(),max(),avg(),count()函数时,有人可以帮助理解为什么没有product()内置函数。那个聚合函数最有效的用户实现是什么?
谢谢, 三位一体
答案 0 :(得分:9)
如果您有指数和日志功能,那么:
PRODUCT(TheColumn) = EXP(SUM(LN(TheColumn)))
答案 1 :(得分:5)
答案 2 :(得分:3)
我将专注于为什么它不是标准功能的问题。
答案 3 :(得分:1)
它可能被遗漏了,因为大多数人不需要它,并且可以在大多数数据库中轻松定义。
PostgreSQL解决方案:
CREATE OR REPLACE FUNCTION product_sfunc(state numeric, factor numeric)
RETURNS numeric AS $$
SELECT $1 * $2
$$ LANGUAGE sql;
CREATE AGGREGATE product (
sfunc = product_sfunc,
basetype = numeric,
stype = numeric,
initcond = '1'
);
答案 4 :(得分:0)
您可以使用游标模拟product()。如果您告诉我们您正在使用哪个数据库平台,那么我们可以为您提供一些示例代码。
答案 5 :(得分:0)
我可以确认确实很少使用product()
聚合函数,但我有一个非常有效的示例,尤其是处理高度聚合的数据,必须在报告。
它利用了其他帖子和其他互联网资源中提到的 exp(sum(ln( multiplyTheseColumnValues )))
“技巧”。
报告(应关注显示,并包含尽可能少的数据计算逻辑,以提供更好的可维护性和灵活性)基本上显示此数据以及一些图形:
DESCR SUM
---------------------------------- ----------
money available in 2013 33233235.3
money spent in 2013 4253235.3
money bound to contracts in 2013 34333500
money spent 2013 in % of available 12
money bound 2013 in % of available 103
(在现实生活中,它有点复杂并且在州预算方案中使用。)
它聚合了前三行中发现的相当复杂的数据。 我不想要通过计算以下行(第4和第5行)的百分比值:
descr
和数字sum
获取任意数量的此类行)并使用一些奇特的逻辑(使用{{ 1}},JasperReports
或类似的)BIRT Reports
,money available
,money spent
)(因为这些都是非常昂贵的操作),只是为了计算百分比值所以我使用了另一个涉及使用产品()功能的技巧。 (如果考虑到上述限制,有人确实知道更好的方法,我会很高兴知道:-))
整个简化示例在下面作为一个可执行SQL提供。 也许它可能有助于为一些甲骨文家伙提供这样的功能,这种功能并不罕见,或者不值得提供,因为它可能在最初的想法中出现。
money bound
答案 6 :(得分:-3)
由于产品注意到了SUM的倍数,所以在SQL中它们没有引入Product聚合函数
例如:<* p>可以实现6 * 4
自己加6次,4次,如6 + 6 + 6 + 6
或
向自身添加4,6次,如4 + 4 + 4 + 4 + 4 + 4
因此给出相同的结果