与窗口函数的累积乘法,“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”不是有效的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用累积和在 Pandas Dataframe 中执行窗口函数操作?