与窗口函数的累积乘法,“exp”不是有效的窗口函数

Posted

技术标签:

【中文标题】与窗口函数的累积乘法,“exp”不是有效的窗口函数【英文标题】:Cumulative multiplication with window functions, 'exp' is not a valid windowing function 【发布时间】:2017-01-27 08:38:32 【问题描述】:

是否可以使用窗口函数进行累积乘法(如下查询)

    select Id, Qty
    into #temp
    from(
            select 1 Id, 5 Qty 

            union   

            select 2, 6

            union   

            select 3, 3
    )dvt

    select 
    t1.Id
    ,exp(sum(log( t2.Qty))) CumulativeMultiply
    from #temp t1
    inner join #temp t2 
        on t2.Id <= t1.Id
    group 
    by t1.Id
    order 
    by t1.Id

喜欢:

select 
        t1.Id
        ,exp(sum(log( t2.Qty))) over (partition by t1.Id order by t1.Id rows between unbounded preceding and current row )  CumulativeMultiply
        from #temp t1
        inner join #temp t2 
            on t2.Id <= t1.Id

但得到错误:

函数 'exp' 不是有效的窗口函数,不能与 OVER 子句一起使用

更新: 我真正想要的结果:

Id          CumulativeMultiply
----------- ----------------------
1           5
2           30
3           90

【问题讨论】:

你刚刚弄错了括号 - 你希望 OVER 应用于 SUM,所以它需要 inside @987654326 的括号@. exp() 不是聚合,所以不能作为窗口函数使用 【参考方案1】:

Sum Over(Order by) 不需要自连接来查找以前的记录并相乘

 select  
        Id
        ,exp(sum(log( Qty))
        over (order by Id )) CumulativeMultiply from #temp 

【讨论】:

我尝试了代码(不完全相同但非常相似)。它仍然提醒 ERROR: 'exp' is not a valid window function【参考方案2】:

只有聚合函数是有效的窗口函数。

我没有测试代码,但是你需要以某种方式将2分开:

SELECT Id, exp(cm) CumulativeMultiply
FROM (
select 
        Id
        ,sum(log(Qty)) over (partition by Id order by Id rows between unbounded preceding and current row )  cm
        from #temp
) d

【讨论】:

Sum Over(Order by) 不需要self join来查找之前的记录并相乘。 @Prdp 纠正我,如果我磨损了...我想,在聚合窗口函数的情况下,我们不能使用 order by...比如 sum over(order by),count over(order by ) ...等等..我说的对吗? @balaji 您可以将 ORDER BY 与 SUM 一起使用,虽然通常它没有任何意义,但是当您运行时,您必须指定行的顺序。

以上是关于与窗口函数的累积乘法,“exp”不是有效的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

使用窗口函数计算 PySpark 中的累积和

如何使用累积和在 Pandas Dataframe 中执行窗口函数操作?

如何创建与列相关的大小的 Pyspark 窗口函数

Oracle ---- 窗口函数

如何在 mysql 5.7 中使用 sum over partition(无窗口函数)

PostgreSQL:使用窗口函数返回单行