Запрос GROUP BY с максимальным значением дата значения - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно запросить таблицу сэмплов, сгруппированных по часам или дням, и получить результат с помощью AVG, Max с датой максимального значения и то же с минимальным значением. Стол будет огромным, поэтому мне нужна лучшая производительность.
Стол:

CREATE TABLE Samples (
[Id]                INT  IDENTITY (1, 1) NOT NULL,
[AvgValue]          FLOAT       NULL,
[SampleDate]        DATETIME      NOT NULL,
[MaxValue]          FLOAT NULL,    
[DT_MaxValue]       DATETIME NULL,
[MinValue]          FLOAT     NULL,
[DT_MinValue]       DATETIME      NULL
);

Строки в таблице:

Id  AvgValue    SampleDate          MaxValue    DT_MaxValue         MinValue    DT_MinValue
1   10          2018-01-01T01:00:00 15          2018-01-01T01:02:00 9           2018-01-01T01:08:00
2   15          2018-01-01T01:15:00 18          2018-01-01T01:22:00 10          2018-01-01T01:16:00
3   17          2018-01-01T02:15:00 19          2018-01-01T02:27:00 12          2018-01-01T02:17:00
4   20          2018-01-01T02:30:00 23          2018-01-01T02:42:00 14          2018-01-01T02:34:00
5   22          2018-01-01T02:45:00 24          2018-01-01T02:52:00 18          2018-01-01T02:46:00
6   25          2018-01-01T03:00:00 27          2018-01-01T03:14:00 22          2018-01-01T03:01:00

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

AvgValue    SampleDate          MaxValue    DT_MaxValue         MinValue    DT_MinValue
12,5        2018-01-01T01:00:00 18          2018-01-01T01:22:00 9           2018-01-01T01:08:00
19,66       2018-01-01T02:00:00 24          2018-01-01T02:52:00 12          2018-01-01T02:17:00
25          2018-01-01T03:00:00 27          2018-01-01T03:14:00 22          2018-01-01T03:01:00

Сложнее всего связать дату с максимальным и минимальным значениями. Я не могу изменить таблицу, но создание представления возможно.

Обновление

Данные поступают из удаленной системы, которая производит выборку данных каждые несколько секунд и с интервалом в 15 минут вычисляет среднее значение, максимальное прочитанное значение (с датой и временем, когда оно было взято) и минимальное значение (с датой и временем) для интервала. , «SampleDate» - это дата и время начала интервала.

Мне нужно запросить таблицу и группу с более длинными интервалами (час, день, месяц), но сохранить максимальное значение и его время, а минимальное - его время.

Под «группой по часам» я подразумеваю необходимость получать значения для каждого часа каждой даты, то есть «2018-01-01T01: 00: 00» отличается от «2018-01-01T01: 00: 00"

Надеюсь, это поможет прояснить вопрос

1 Ответ

0 голосов
/ 09 мая 2018

Ваш код выглядит как SQL Server. Чтобы получить резюме по дням:

SELECT CAST(SampleDate as date),
       AVG( AvgValue ) AS AvgValue,
       MAX( Maxvalue ) AS MaxValue,
       MAX( DT_MaxValue ) AS DT_MaxValue
FROM t
GROUP BY CAST(SampleDate as date);

Самый простой способ получить образцы по часам - это также включить час:

SELECT CAST(SampleDate as date), DATEPART(HOUR, SampleDate),
       AVG( AvgValue ) AS AvgValue,
       MAX( Maxvalue ) AS MaxValue,
       MAX( DT_MaxValue ) AS DT_MaxValue
FROM t
GROUP BY CAST(SampleDate as date),  DATEPART(HOUR, SampleDate);
...