Функция окна SQL сгруппирована, но по-прежнему получает «должно быть агрегатным выражением или фигурировать в предложении GROUP BY»

У меня есть запрос SQL (presto), скажем так:

      select
      id
    , product_name
    , product_type
    , sum(sales) as total_sales
    , sum(sales) over (partition by type) as sales_by_type

from some_table

group by 1,2,3

Когда я запускаю это, я получаю сообщение об ошибке, сообщающее мне, что оконная функция должна появиться в GROUP BYпункт. Лучшее решение разбить это на подзапрос? Или мне нужно внести некоторые изменения в синтаксис, чтобы это сработало?

2 ответа

Если вам нужен общий объем продаж для данного типа, вам нужно вложить sum()s:

      select id, product_name, product_type,
       sum(sales) as total_sales,
       sum(sum(sales)) over (partition by type) as sales_by_type
from some_table
group by 1,2,3;

Если вы также хотите получить общую сумму всех продаж, тогда:

      select id, product_name, product_type,
       sum(sales) as total_sales,
       sum(sum(sales)) over (partition by type) as sales_by_type,
       sum(sum(sales)) over () as total_total_sales
from some_table
group by 1,2,3;

Вам нужно что-то вроде ниже

      select
      id
    , product_name
    , product_type
    , sum(sales) over () as total_sales
    , sum(sales) over (partition by type) as sales_by_type
    from some_table

или же

      select
      id
    , product_name
    , product_type
    , sum(sales) over (partition by (select 1)) as total_sales
    , sum(sales) over (partition by type) as sales_by_type
    from some_table

Оба они работают на сервере sql. Не уверен, что / если это сработает для presto.

Я также видел вариации ниже.

      over (partition by null)
Другие вопросы по тегам