如何在窗口函数和 Case when 语句中使用除法

Posted

技术标签:

【中文标题】如何在窗口函数和 Case when 语句中使用除法【英文标题】:How to use division with window function and Case when statement 【发布时间】:2020-07-16 09:04:09 【问题描述】:

它适用于 sum() 但不适用于 sum()/sum()

使用 sum():

select *, 
case when time_of_day_viewers_time_zone >= '06:00:00 -
06:59:59' and time_of_day_viewers_time_zone <= '10:00:00 - 10:59:59'
then sum(amount_spent_usd) over () else null end as cpm 
from t1

不适用于 sum()/sum():

select *,
case when time_of_day_viewers_time_zone >= '06:00:00 - 06:59:59'
and time_of_day_viewers_time_zone <= '10:00:00 - 10:59:59'
then sum(amount_spent_usd)/sum(impressions)*1000 
over () else null end as cpm
from t1

edit1:即使我使用 sum(amount_spent_usd)/nullif(sum(impressions),0)*1000 它仍然说“在“结束”或附近出现语法错误'

编辑2:

sum(amount_spent_usd) over () / (sum(impressions) over () * 1000)

如果我使用这个查询,它总和所有 24 小时,这意味着不应用语句的情况。如何解决这个问题?

编辑4: 最后我使用了这个查询,虽然它很长..

 (sum(case when time_of_day_viewers_time_zone >= '06:00:00 - 06:59:59'
and time_of_day_viewers_time_zone <= '10:00:00 - 10:59:59'
then amount_spent_usd else null end) over () /sum(case when time_of_day_viewers_time_zone >= '06:00:00 - 06:59:59'
and time_of_day_viewers_time_zone <= '10:00:00 - 10:59:59'
then impressions else null end) over ())*1000 as new

提前致谢

【问题讨论】:

指定无效。疯狂猜测:除以零? @Turo 即使我使用 sum(amount_spent_usd)/nullif(sum(impressions),0)*1000 它仍然说“在“超过”处或附近出现语法错误' 【参考方案1】:

over()不能用于两个窗口函数,需要分别为每个函数提供窗口子句。并且需要对整个表达式进行乘法运算:

sum(amount_spent_usd) over () / (sum(impressions) over () * 1000)

【讨论】:

有趣的是,我问了这个之后我是怎么想出来的。 “哭笑”谢谢。 你好,我发现了一个大问题,如果我使用这个查询,它总结了所有24小时,这意味着没有应用语句的情况 @HaoHao . . .这回答了您在此处提出的问题——关于语法错误。如果您有更详细的问题,请提出一个新的问题,并附上适当的样本数据、期望的结果以及您想要做什么的解释。

以上是关于如何在窗口函数和 Case when 语句中使用除法的主要内容,如果未能解决你的问题,请参考以下文章

case when用法sql

SQL语句中case,when,then的用法

sql 中 case when 语法

case when 用法

oracle如何在CASE WHEN ELSE语句中使用select语句?

casewhen能用并且吗