如何获取分成 5 分钟间隔的每个小时增量的平均值

How to get average value for each hourly increment that is split into 5 minute intervals

我有一个 AWS Redshift table,如下所示:

interval_date interval_time power on_status
2022-05-01 00:00 2.65 Y
2022-05-01 00:05 3.92 Y
2022-05-01 00:10 2.05 Y
2022-05-01 00:15 1.85 Y
2022-05-01 00:20 5.92 Y
2022-05-01 00:25 7.52 Y
2022-05-01 00:30 9.84 Y
2022-05-01 00:35 6.84 N
2022-05-01 00:40 5.01 N
2022-05-01 00:45 4.70 N
2022-05-01 00:50 8.57 N
2022-05-01 00:55 1.94 N
2022-05-01 01:00 3.87 Y

table 继续使用更多的时间戳,一直到 11:55 下午为止的任何给定日期,直到当前 day/time。我正在尝试获取每个小时间隔的 power 的平均值(因此 12 AM 的平均值应该是前一天(4/30/2022)在 23:05 到当天的值( 5/1/2022) 在 00:00,凌晨 1 点是 00:05 到 01:00,凌晨 2 点是 01:05 到 02:00,等等)其中 on_status 等于 Y.

我有一个基本查询,可以获取一整天的平均值(对于上下文,interval_date 将被参数化)。

SELECT AVG(power)
FROM table
WHERE on_status = 'Y'
  AND interval_date = '2022-05-01';

我不确定如何对 interval_time 列进行分区,以便每小时对值进行平均。我正在寻找的最终结果的想法是:

interval_date interval_time power on_status
2022-05-01 00:00 2.65 Y
2022-05-01 01:00 5.00 Y
2022-05-01 02:00 X Y
2022-05-01 03:00 X Y

你没有为 interval_time 指定类型,所以我假设是一个字符串,你可以用这样的 case 语句解析它:

SELECT interval_date,
       CASE WHEN SUBSTRING(interval_time,4,2)='00' THEN interval_time
            WHEN SUBSTRING(interval_time,1,2)='23' THEN '00:00'
            ELSE FORMAT(convert(int,SUBSTRING(interval_time,1,2))+1,'00')+':00'
       END interval_time,
       AVG(power)
 FROM mytable
WHERE on_status = 'Y'
GROUP BY interval_date,
       CASE WHEN SUBSTRING(interval_time,4,2)='00' THEN interval_time
            WHEN SUBSTRING(interval_time,1,2)='23' THEN '00:00'
            ELSE FORMAT(convert(int,SUBSTRING(interval_time,1,2))+1,'00')+':00'
       END

请注意,为了获得 5.17 的目标,我不得不注释掉 on_status = 'Y' 过滤器。

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b604e4fe6696465aac75676e69b92a47