Presto 平均窗函数
Posted
技术标签:
【中文标题】Presto 平均窗函数【英文标题】:Presto average window function 【发布时间】:2020-07-21 16:49:49 【问题描述】:我有一个如下所示的表格:
+---------+-------------------+-------+
| merchant|time |amount |
+---------+-------------------+-------+
| 1 |2020-04-01 10:15:01| 1234|
| 2 |2020-04-01 10:15:02| 50|
| 1 |2020-04-01 10:15:15| 820|
| 1 |2020-04-01 10:15:20| 29|
| 2 |2020-04-01 10:15:21| 260|
+---------+-------------------+-------+
我希望获得每个商家每分钟的平均交易次数。
我可以做类似的事情
select
merchant,
avg(transactions_per_minute)
from (
select
merchant,
date_trunc('minute', time) as time,
count(*) as transactions_per_minute
from transactions
group by 1, 2
)
但是有没有办法用窗口函数来做到这一点?我在想象类似的东西
select
merchant,
avg(count(*) over (partition by date_trunc('minute', time)) as transactions_per_minute
from transactions
group by 1
但这会引发错误Cannot nest window functions inside aggregation 'avg'
【问题讨论】:
【参考方案1】:你应该可以做到:
select merchant,
(count(*) over (partition by merchant) /
count(distinct date_trunc('minute', time)) over (partition by merchant)
)
from transactions t;
我不记得 Presto 是否支持 COUNT(DISTINCT)
作为窗口函数。如果没有:
select merchant,
(count(*) over (partition by merchant) /
(dense_rank() over (partition by merchant order by date_trunc('minute', time)) +
dense_rank() over (partition by merchant order by date_trunc('minute', time) desc)
)
from transactions t;
注意:这正是您的查询所做的(或最终的group by
)——它忽略了没有交易的分钟。如果您想包含这些内容,请提出 新 问题。
【讨论】:
以上是关于Presto 平均窗函数的主要内容,如果未能解决你的问题,请参考以下文章