Группировка 6-часовых данных за отдельные дни с SQL Server

Используя SQL Server 2000,

У меня есть данные, которые содержат дату и время, скажем, DateData и OtherData. Данные собираются с течением времени с интервалом в пять минут, поэтому, например, DateData - это упорядоченный DateTime с 01.02.2016 по 24.02.2015 с 5-минутным промежутком между каждой новой точкой данных.

В настоящее время я пытаюсь усреднить данные, чтобы можно было получать среднее значение OtherData каждые 6 часов для каждого дня в отдельности. До сих пор я придумал следующий SQL, который группирует все данные по 6-часовым интервалам, поэтому я получаю средние значения по всем дням, а не по отдельным.

SELECT
DATEPART(hour, DateData)/6,
AVG(OtherData) AS AvgData
FROM DATASITE
GROUP BY DATEPART(hour, DateData)/6

--Result:
|Column1 | AvgData|
|0 | 11|
|1 | 12|
|2 | 13|
|3 | 14|

Как бы я изменил вышеуказанный запрос, чтобы получить средние значения для отдельных дней, а не для всех дней вместе?

2 ответа

Добавлять DateData в Group by сгруппировать строки на каждый день

SELECT
DATEPART(hour, DateData)/6,
AVG(OtherData) AS AvgData
FROM DATASITE  
GROUP BY cast(DateData as date),
         DATEPART(hour, DateData)/6

Вы можете сделать что-то вроде этого:

      SELECT  CAST(CONVERT(VARCHAR(8), CAST(x.datedata AS DATETIME), 112) AS DATETIME) AS dt
,   DATEPART(hour, DateData)/6
,   AVG(OtherData) AS AvgData
FROM (
    select '20230730 15:00' as datedata
    , 1. as otherdata
    union all
    select '20230730 16:00' as datedata
    , 2. as otherdata
    union all
    select '20230730 17:00' as datedata
    , 2. as otherdata
    union all
    select '20230730 18:00' as datedata
    , 2. as otherdata
    union all
    select '20230731 00:00' as datedata
    , 2. as otherdata
    union all
    select '20230731 01:00' as datedata
    , 2. as otherdata
    ) x
GROUP BY DATEPART(hour, DateData)/6
,   CAST(CONVERT(VARCHAR(8), CAST(x.datedata AS DATETIME), 112) AS DATETIME)

Чтобы удалить части времени, вы можете преобразовать дату в varchar, используя стиль 112(ГГГГММдд), а затем преобразовать ее обратно в дату и время.

Другие вопросы по тегам