Престо средняя оконная функция - PullRequest
1 голос
/ 09 апреля 2020

У меня есть таблица, которая выглядит следующим образом:

+---------+-------------------+-------+
| 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 Ответ

1 голос
/ 09 апреля 2020

Вы должны быть в состоянии сделать:

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) - он игнорирует минуты без транзакций. Если вы хотите включить их, задайте новый вопрос.

...