什么是另一种在声明时使用窗口函数和大小写除法的方法[关闭]

Posted

技术标签:

【中文标题】什么是另一种在声明时使用窗口函数和大小写除法的方法[关闭]【英文标题】:What is Another way to use division with window function and case when statement [closed] 【发布时间】:2020-07-16 11:44:53 【问题描述】:

我想在特定时间计算每次展示费用 (CPM),所以我使用它,有效,但还有其他更短的方法吗? 我使用窗口函数显示所有行不需要GROUP BY

select      (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 CPM
from t1

我用这个但是不行

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 ()/ sum(impressions) over ())*1000 
else null end as cpm
from t1

【问题讨论】:

聚合完成over windows。 case 声明不是。 over () 似乎是多余的。您可能应该发布完整的代码,而不仅仅是子表达式。 @underscore_d 不,我的目的不是使用GROUP BY,所以我使用 over() 在所有行中显示它 与您的问题无关,但 time_of_day_viewers_time_zone 最好存储为时间 range 而不是一些字符串/文本值。 【参考方案1】:

过滤后的聚合应该这样做:

(sum(amount_spent_usd) filter (where 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') over ())
                                  
/ 
   
((sum(impressions) filter (where 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') over ()) * 1000)

【讨论】:

以上是关于什么是另一种在声明时使用窗口函数和大小写除法的方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

另一种在WINFORM中使用XNA的方法

在cython中使用参数声明函数时出错[关闭]

另一种在不弹出 Internet Explorer 的情况下向 VSTS 进行身份验证的方法?

模意义下的除法变乘法

了解如何从内部函数更新原始二维数组

一种在结构中查找填充大小和位置的方法?