Использование Over & Partition в SQL - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть таблица SQL с ежемесячными ценами на продукты из разных категорий (например, фрукты, овощи, молочные продукты).Я хотел бы рассчитать текущее среднемесячное значение для конкретной категории и для всех продуктов в одном месяце в одном запросе.

Итак, объединение:

Select date, avg(price) group by date where category = 'Fruit'

Select date, avg(price) group by date

Возможно ли этоиспользовать OVER & Partition (или любой другой способ в этом отношении)

Редактировать

  • Я использую MS SQL
  • Мои данные ежемесячные, поэтому я нене нужно извлекать даты окончания месяца - я могу просто группировать по дате, тогда я получу данные конца месяца
  • Например, если моя таблица выглядит так:

| Дата|Пункт |Категория | Цена |
| Янв | Банан |Фрукты |10 |
| Ян | Картофель |Вег |20 |

Тогда результат будет

Дата |Фрукты Avg |Всего Avg |
Янв |10 |15

Заранее извиняюсь за искажение таблиц, но это для другого потока.

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Попробуйте использовать

Select extract(year from date)||extract(month from date) as month, 
       category, avg(price) as avg_price            
  from sales
 group by month, category

PS с псевдонимом month может быть запрещено для некоторых систем баз данных, в этом случае замените месяц на extract(year from date)||extract(month from date) в группе по списку.Также оператор конкатенации может отличаться, заменяя каналы (||) со знаком плюс (+) всякий раз, когда встречается такая ситуация.

0 голосов
/ 27 ноября 2018

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

select date_trunc('month', date) as month, 
       avg(price) as avg_per_month,
       avg(avg(price)) over (order by date_trunc('month', date))
from t
where category = 'Fruit'
group by date_trunc('month', date)
 order by date_trunc('month', date);

Если у вас есть только одна строка в месяц, тогда вы можетеделать:

select date, price,
       avg(price) over (order by date)
from t
where category = 'Fruit'
order by date;
0 голосов
/ 27 ноября 2018

зачем тебе больше?

Select date, category , avg(price) group by date, category 
...