Среднее значение по группам

#sql-server #tsql

Вопрос:

Допустим, у меня есть этот запрос ниже, который выбирает все сектора и получает значение, когда дата приходится на любую из этих 3 дат, указанных в WHERE предложении.

 SELECT 
Sector
,Val
FROM [Consumption] upc
WHERE upc.PeriodStart = '2020-12-07 17:00:00' 
    OR upc.PeriodStart = '2021-01-07 17:30:00' 
    OR upc.PeriodStart = '2021-02-10 18:00:00'

 

Текущий Результат:

 Sector        Val
Retail        53.4
Retail        58.1
Retail        60.5
Commercial    58.2
Commercial    60.6
Commercial    53.5

 

Как бы я мог получить среднее значение между значениями, сгруппированными по секторам, умноженное на 2, чтобы результат выглядел следующим образом?

ожидаемый результат:

 Sector        Val       AvTot
Retail        53.4      114.67
Retail        60.5      114.67
Retail        58.1      114.67
Commercial    58.2      114.87
Commercial    60.6      114.87
Commercial    53.5      114.87


 

Комментарии:

1. Есть ли причина для включения val в группу by?

2. Вы исказили свой первый запрос и случайно пропустили среднее значение по совокупности? Если нет, объясните, почему в нем есть предложение GROUP BY.

3. Моя ошибка, это была часть подзапроса, изначально он не предназначался для этого примера. Я удалил его

Ответ №1:

Окно AVG() возвращает ожидаемые результаты:

 SELECT Sector, Val, AVG(Val * 2) OVER (PARTITION BY Sector) AS AvgTotal
FROM (VALUES
   ('Retail',        53.4),
   ('Commercial',    58.2),
   ('Retail',        60.5),
   ('Commercial',    60.6),
   ('Commercial',    53.5),
   ('Retail',        58.1)
) [Consumption] (Sector, Val)
ORDER BY Sector
 

Результат (без округления и/или приведения):

 Sector     Val  AvgTotal
--------------------------
Commercial 58.2 114.866666
Commercial 60.6 114.866666
Commercial 53.5 114.866666
Retail     60.5 114.666666
Retail     58.1 114.666666
Retail     53.4 114.666666
 

Комментарии:

1. Оконная функция AVG() работает вместе с подзапросом, а не с явным указанием значений, но да, это также работает

2. @mdbuzzer явно указанные значения-это просто способ представления набора данных без явного создания таблицы. Если вам нужны ответы, которые всегда ссылаются на ваши таблицы, помогите нам, создав пример таблицы в базе данных<>fiddle<> .