为什么SQL中没有PRODUCT聚合函数?

loc*_*ock 51 sql aggregate

我正在寻找SELECT PRODUCT(table.price) FROM table GROUP BY table.sale类似于SUM工作方式的东西.

我是否遗漏了文档中的内容,或者确实没有PRODUCT功能?

如果是这样,为什么不呢?

注意:我在postgres,mysql和mssql中查找了函数,发现没有,所以我假设所有的sql都不支持它.

gbn*_*gbn 50

对于MSSQL,您可以使用它.它可以用于其他平台:它只是数学和对数的聚合.

SELECT
    GrpID,
    CASE
       WHEN MinVal = 0 THEN 0
       WHEN Neg % 2 = 1 THEN -1 * EXP(ABSMult)
       ELSE EXP(ABSMult)
    END
FROM
    (
    SELECT
       GrpID, 
       --log of +ve row values
       SUM(LOG(ABS(NULLIF(Value, 0)))) AS ABSMult,
       --count of -ve values. Even = +ve result.
       SUM(SIGN(CASE WHEN Value < 0 THEN 1 ELSE 0 END)) AS Neg,
       --anything * zero = zero
       MIN(ABS(Value)) AS MinVal
    FROM
       Mytable
    GROUP BY
       GrpID
    ) foo
Run Code Online (Sandbox Code Playgroud)

取自我的答案:SQL Server查询 - 分组乘法

  • "它只是数学和对数的聚合":)`log(a*b*c ...*n)= log(a)+ log(b)+ log(c)... + log(n)` (5认同)

one*_*hen 26

PRODUCTSQL Standard中没有set函数.它似乎是一个有价值的候选者(不像,例如,一个CONCATENATE集函数:它不适合SQL,例如,结果数据类型将涉及多值并且就第一范式形成问题).

SQL标准旨在整合1990年左右的SQL产品功能,并为未来的发展提供"思想领导力".简而言之,它们记录了SQL的作用以及SQL应该做什么.没有PRODUCT设定功能表明,1990年没有供应商,虽然它值得包含,并且没有学术兴趣将其引入标准.

当然,供应商总是试图添加自己的功能,这些天通常作为标准的扩展而不是切线.我不记得PRODUCT在我使用的任何SQL产品中看到了一个集合函数(甚至需要一个函数).

在任何情况下,解决办法是相当简单的使用logexp标量函数(和逻辑来处理底片)与SUM组功能; 有关示例代码,请参阅@ gbn的答案.不过,我从来不需要在商业应用程序中这样做.

总之,我最好的猜测是SQL终端用户对PRODUCTset函数没有要求; 此外,任何具有学术兴趣的人都可能会找到可接受的解决方法(即不会重视一PRODUCT组函数会提供的语法糖).

出于兴趣,SQL Server Land确实需要新的集合函数,但对于窗口函数种类(以及标准SQL)也是如此.有关详细信息,包括如何参与进一步的驾驶需求,请参阅Itzik Ben-Gan的博客.

  • +1"SQL标准中没有PRODUCT设置功能.它似乎是一个有价值的候选者,但是" - 几何平均函数也是如此. (3认同)
  • 不幸的是,这个答案是完全错误的。exp(sum(log(column))) 适用于正数或查看下面更好的答案。 (2认同)

Lor*_*ter 25

我不知道为什么没有一个,但(更多地关注负数)你可以使用日志和指数来做: -

select exp (sum (ln (table.price))) from table ...
Run Code Online (Sandbox Code Playgroud)

  • 如果要计算整数列的值的乘积,请添加round().有时返回.9999 ...而不是整个int. (3认同)
  • 这很聪明 (2认同)
  • 在 T-SQL 中,`select exp (sum (log (table.price)))` (2认同)

Fen*_*ton 8

你可以执行产品聚合功能,但你必须自己做数学运算,就像这样......

SELECT
    Exp(Sum(IIf(Abs([Num])=0,0,Log(Abs([Num])))))*IIf(Min(Abs([Num]))=0,0,1)*(1-2*(Sum(IIf([Num]>=0,0,1)) Mod 2)) AS P
FROM
   Table1
Run Code Online (Sandbox Code Playgroud)

来源:http://productfunctionsql.codeplex.com/


Dav*_*yan 6

T-SQL中有一个巧妙的技巧(不确定它是否为ANSI)允许将一组行中的字符串值连接成一个变量.看起来它也适用于倍增:

declare @Floats as table (value float)
insert into @Floats values (0.9)
insert into @Floats values (0.9)
insert into @Floats values (0.9)

declare @multiplier float = null

select 
    @multiplier = isnull(@multiplier, '1') * value
from @Floats

select @multiplier
Run Code Online (Sandbox Code Playgroud)

这可能比log/exp解决方案在数值上更稳定.