简体   繁体   English

Select 在 sql 的时间范围内以 1 小时为间隔的最大数据

[英]Select max data in interval of 1 hour within a time range in sql

I have some difficulties with sql server to select max value in a column in interval of 1 hour within a time range.我在使用 sql 服务器到 select 在一个时间范围内以 1 小时为间隔的列中的最大值时遇到了一些困难。

My table look like this:我的表如下所示:

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

How do I select max Value column in interval of 1 hour within a time range from 2019-04-21 08:21:50 to 2019-04-22 11:47:50我如何 select 最大值列在 2019 年2019-04-21 08:21:50 2019-04-22 11:47:50时间范围内以 1 小时为间隔

I want my output to be like this:我希望我的 output 是这样的:

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

You can use ROW_NUMBER() in a subquery to assign a rank to each record withing groups of each records having the same timestamp (minutes and seconds excluded) ordered by value, and then filter on the top record in each group in the outer query:您可以在子查询中使用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

Demo on DB Fiddle : DB 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

If you want the average value within each 1h range as well, then:如果您还想要每个 1h 范围内的平均值,那么:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM