Выберите максимальный объем данных в интервале 1 час в диапазоне времени в sql - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть некоторые трудности с сервером sql, чтобы выбрать максимальное значение в столбце с интервалом в 1 час за определенный промежуток времени.

Моя таблица выглядит следующим образом:

+----------+-------+---------------------+
|    Id    | Value |      TimeStamp      |
+----------+-------+---------------------+
| 02030105 | 32.20 | 2019-04-21 08:21:50 |
| 02030106 | 30.00 | 2019-04-21 08:36:40 |
| 02030107 | 30.50 | 2019-04-21 08:51:10 |
| 02030108 | 27.70 | 2019-04-21 09:31:23 |
| 02030201 | 32.20 | 2019-04-21 09:50:30 |
| 02030202 | 32.00 | 2019-04-22 10:19:50 |
| 02030203 | 31.70 | 2019-04-22 10:34:26 |
| 02030204 | 31.00 | 2019-04-22 11:33:04 |
| 02030205 | 31.20 | 2019-04-22 11:47:50 |
+----------+-------+---------------------+

Как сделатьЯ выбираю столбец максимального значения с интервалом в 1 час в диапазоне от 2019-04-21 08:21:50 до 2019-04-22 11:47:50

Я хочу, чтобы мой вывод был таким:

+----------+-------+---------------------+
|    Id    | Value |      TimeStamp      |
+----------+-------+---------------------+
| 02030105 | 32.20 | 2019-04-21 08:21:50 |
| 02030201 | 32.20 | 2019-04-21 09:50:30 |
| 02030202 | 32.00 | 2019-04-22 10:19:50 |
| 02030205 | 31.20 | 2019-04-22 11:47:50 |
+----------+-------+---------------------+

1 Ответ

1 голос
/ 19 сентября 2019

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...