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 平均窗函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 presto 查询中应用循环

Presto 中的用户定义函数

Athena (Presto) SQL 窗口函数

等效于 hive 中 Presto 的 transform() 函数

presto和hive日期函数对比

Presto URL 函数