Вы можете использовать ROW_NUMBER()
в подзапросе, чтобы присвоить ранг каждой записи, причем группы каждой записи имеют одинаковую метку времени (исключая минуты и секунды), упорядоченную по значению, а затем фильтруют верхнюю запись в каждой группе ввнешний запрос:
SELECT id, value, timestamp
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(
PARTITION BY dateadd(hour, datediff(hour, 0, timestamp), 0)
ORDER BY value DESC
) rn
FROM mytable t
) x WHERE rn = 1
Демонстрация по БД Fiddle :
id | value | timestamp
------: | :---- | :------------------
2030105 | 32.20 | 2019-04-21 08:21:50
2030201 | 32.20 | 2019-04-21 09:50:30
2030202 | 32.00 | 2019-04-22 10:19:50
2030205 | 31.20 | 2019-04-22 11:47:50
Если вы хотите среднее значение в течение каждого 1чдиапазон также:
SELECT id, value, timestamp, avg_value
FROM (
SELECT
t.*,
ROW_NUMBER() OVER(
PARTITION BY dateadd(hour, datediff(hour, 0, timestamp), 0)
ORDER BY value DESC
) rn,
AVG(value) OVER(
PARTITION BY dateadd(hour, datediff(hour, 0, timestamp), 0)
) avg_value
FROM mytable t
) x WHERE rn = 1