如何获取分成 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
我有一个 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