将记录分组60分钟,从第一条记录的时间戳开始计时

时间:2017-06-06 16:47:09

标签: sql postgresql

我有一个按小时对记录进行分组的查询,如下所示:

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

提前致谢!!

1 个答案:

答案 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保存到某个变量,而不是使用子查询。