2017-06-06 68 views
1

我有如下所示按小时组的记录的查询:分组记录了60分钟持续时间,从所述第一记录的时间戳开始小时

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分钟。

这个需求的一点背景:我有一个自动测试,导致数据库被填充。在测试开始之前,数据库可能已经有一些记录。我的自动化测试的目标是每小时执行一定数量的任务。我正在寻找一种方法来验证我的测试的准确性,方法是在数据库中为每个小时生成一个报告,其中小时从匹配条件的第一条记录的时间戳(分钟)开始(我可以定义一个条件以匹配由我的自动化,所以它拿起自动化发送的第一个记录)

因此,目标是按小时对记录进行分组,但小时应使用匹配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

你可以添加一个子查询选择你的条件的第一个测试时间,并从date_trunc函数得到它像'select date_trunc('hour',first_date).......... from my_table,(select min (insert_time)作为first_date从.....)a where .... group by 1,2 .....' –

回答

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