什么是另一种在声明时使用窗口函数和大小写除法的方法[关闭]
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)
【讨论】:
以上是关于什么是另一种在声明时使用窗口函数和大小写除法的方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章