Группировка 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(ГГГГММдд), а затем преобразовать ее обратно в дату и время.