查询以每4小时基于时间戳获取最大值

问题描述 投票:0回答:3

我有一个sql表,每15分钟存储一次数据,但我想每4小时获取一次最大值。

这是我的实际表格:

+----+----+----+-------------------------+
| Id | F1 | F2 |        timestamp        |
+----+----+----+-------------------------+
|  1 | 24 | 30 | 2019-03-25 12:15:00.000 |
|  2 | 22 |  3 | 2019-03-25 12:30:00.000 |
|  3 |  2 |  4 | 2019-03-25 12:45:00.000 |
|  4 |  5 | 35 | 2019-03-25 13:00:00.000 |
|  5 | 18 | 23 | 2019-03-25 13:15:00.000 |
|  ' | '  |  ' | '                       |
| 16 | 21 | 34 | 2019-03-25 16:00:00.000 |
+----+----+----+-------------------------+

我正在寻找的输出是:

+----+----+----+
| Id | F1 | F2 |
+----+----+----+
|  1 | 24 | 35 |1st 4 Hours
+----+----+----+
|  2 | 35 | 25 |Next 4 Hours
+----+----+----+

我确实使用了查询

select max(F1) as F1,
       max(F2) as F2
from table
where timestamp>='2019/3/26 12:00:01'
  and timestamp<='2019/3/26 16:00:01'

并且它返回前4个小时的值但是当我将时间戳从4小时增加到8小时时它仍然会给我1个最大值而不是每4个小时2个。

我确实试过了group by子句但是没能得到预期的结果。

sql sql-server
3个回答
1
投票

这应该工作

SELECT   Max(f1), 
         Max(f2), datepart(hh,timestamp), convert(date,timestamp) 
FROM     TABLE 
WHERE    datepart(hh,timestamp)%4 = 0 
AND timestamp>='2019/3/26 12:00:01' 
AND      timestamp<='2019/3/26 16:00:01'
GROUP BY datepart(hh,timestamp), convert(date,timestamp)
ORDER BY convert(date,timestamp) asc

1
投票

这是一个相对简单的方法:

select convert(date, timestamp) as dte,
       (datepart(hour, timestamp) / 4) * 4 as hour,
       max(F1) as F1,
       max(F2) as F2
from table
group by convert(date, timestamp), (datepart(hour, timestamp) / 4) * 4;

这会将日期和小时分成不同的列;你可以使用dateadd()将它们放在一列中。


0
投票

试试这个查询:

declare @startingDatetime datetime = '2017-10-04 12:00:00';
select grp, max(F1) F1, max(F2) F2
from (
    select datediff(hour, @startingDatetime, [timestamp]) / 4 grp, *
    from MyTable
    where [timestamp] > @startingDatetime
) a group by grp
© www.soinside.com 2019 - 2024. All rights reserved.