SQL Server 在sql中选择时间范围内间隔1小时的最大数据

gblwokeq  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(187)

我有一些困难与sql server选择最大值在一列的时间范围内的间隔为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 |
+----------+-------+---------------------+

如何在从2019-04-21 08:21:502019-04-22 11:47:50的时间范围内选择间隔为1小时的最大值列
我希望输出如下所示:

+----------+-------+---------------------+
|    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 |
+----------+-------+---------------------+
z31licg0

z31licg01#

您可以在子查询中使用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
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

相关问题