我有一个按小时对记录进行分组的查询,如下所示:
select date_trunc('hour', insert_time),
file_type,
avg(file_size)
from my_table
where insert_time > now()::timestamp - interval '7 days'
group by 1, 2 order by 1, 2
这将记录分组为一小时窗口,其中每小时窗口从0th
分钟开始。
此要求的一些背景知识:我有一个自动化测试,可以填充数据库。在测试开始之前,DB可能已经有一些记录。我的自动化测试的目标是每小时完成一定数量的任务。我正在寻找一种方法来验证我的测试的准确性,方法是在每小时在数据库中生成一个报告,其中小时从第一个记录的时间戳(分钟)开始,匹配一个条件(我可以定义一个条件匹配我的自动化发送的自定义字符串,因此它获取自动化发送的第一个记录
因此,目标是按小时对记录进行分组,但应使用与WHERE条件匹配的第一条记录的分钟作为起点计算小时。
因此,如果由于我的自动化而插入的第一条记录的时间戳为2017-06-06 07:47:04.012734
,那么分组应该是这样的:
1st group => 2017-06-06 07:47:04.012734 to 2017-06-06 08:47:04.012734
2nd group => 2017-06-06 08:47:04.012734 to 2017-06-06 09:47:04.012734
3rd group => 2017-06-06 09:47:04.012734 to 2017-06-06 10:47:04.012734
.
.
.
提前致谢!!
答案 0 :(得分:0)
一种方法是首先读取第一条记录的时间戳。然后从其他值中减去它,截断为一小时精度并将其重新添加。
WITH
CTE_MinTime
AS
(
select
MIN(insert_time) AS MinTime
from my_table
where insert_time > now()::timestamp - interval '7 days'
)
select
CTE_MinTime.MinTime + date_trunc('hour', insert_time - CTE_MinTime.MinTime),
file_type,
avg(file_size)
from
my_table
CROSS JOIN CTE_MinTime
where insert_time > now()::timestamp - interval '7 days'
group by 1, 2
order by 1, 2
;
您可以将MinTime
保存到某个变量,而不是使用子查询。