AVG
- агрегатная функция.Использование агрегатных функций подразумевает группирование.Вы агрегируете значения во всем наборе строк или в группах.В первом случае у вас не может быть неагрегированных столбцов (кроме статических значений, таких как ваши 'Green'
, 'Avg'
), а во втором случае вы должны ввести предложение GROUP BY, где вы должны перечислить все столбцы, которыеопределить группы: они будут не агрегированы в списке SELECT.Поскольку у вашего запроса есть некоторые неагрегированные значения, это, скорее всего, второй случай, и ваш запрос должен выглядеть примерно так:
SELECT
RecordedDateTime AS DataGroup,
TagValueInteger AS DataBar,
TagValueInteger AS DataLine,
'Green' AS DataColor,
'Avg' AS DataExtraLineLabel,
AVG(TagValueInteger) AS DataExtraLineValue,
'Blue' AS DataExtraLineColor
FROM tTagHistory
WHERE
(TagHistoryDefinitionID = 2) AND
(IsQualityGood = 1) AND
(DeltaValueInteger <> 0) AND
(TagValue > 4) AND
(TagValue < 60) AND
(RecordedDateTime > (GetDate()-2))
<b>GROUP BY RecordedDateTime, TagValueInteger</b>
ORDER BY RecordedDateTime DESC
Однако, что касается вашего поста, еще более вероятно, что выхотите получить как агрегированные, так и неагрегированные значения.В этом случае вам нужна оконная агрегация.Агрегированная функция становится агрегированной оконной функцией, если добавить к ней OVER
условие .В вашем конкретном случае это, вероятно, должно выглядеть следующим образом:
SELECT
RecordedDateTime AS DataGroup,
TagValueInteger AS DataBar,
TagValueInteger AS DataLine,
'Green' AS DataColor,
'Avg' AS DataExtraLineLabel,
AVG(TagValueInteger) <b>OVER ()</b> AS DataExtraLineValue,
'Blue' AS DataExtraLineColor
FROM tTagHistory
WHERE
(TagHistoryDefinitionID = 2) AND
(IsQualityGood = 1) AND
(DeltaValueInteger <> 0) AND
(TagValue > 4) AND
(TagValue < 60) AND
(RecordedDateTime > (GetDate()-2))
ORDER BY RecordedDateTime DESC
AVG(TagValueInteger) OVER ()
возвращает среднее значение TagValueInteger
для всего набора строк.В качестве альтернативы вы можете изменить предложение OVER ()
, чтобы оно возвращало разные (возможно, повторяющиеся) значения для разных групп, например, `AVG(TagValueInteger) OVER (PARTITION BY DataGroup)
будет возвращать разные средние значения, каждое для разных значений DataGroup
.Подробнее об этом вы можете прочитать в связанной статье.