为什么SQL中没有“product()”聚合函数?

时间:2010-12-20 04:53:43

标签: sql oracle aggregate-functions

当有Sum(),min(),max(),avg(),count()函数时,有人可以帮助理解为什么没有product()内置函数。那个聚合函数最有效的用户实现是什么?

谢谢, 三位一体

7 个答案:

答案 0 :(得分:9)

如果您有指数和日志功能,那么:

PRODUCT(TheColumn) = EXP(SUM(LN(TheColumn)))

答案 1 :(得分:5)

可以使用CLR在SQL 2005及更高版本中创建用户定义的聚合。在Postgresql中,您可以在Postgres itself中执行此操作,同样使用Oracle

答案 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 Reportsmoney availablemoney 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

因此给出相同的结果