【问题标题】:Grouping records by 60 minute duration, starting the hour from the timestamp of the first record按 60 分钟持续时间对记录进行分组,从第一条记录的时间戳开始的小时
【发布时间】:2017-06-06 16:47:08
【问题描述】:

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

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

提前致谢!!

【问题讨论】:

  • 您可以添加一个子查询,根据您的条件选择第一个测试时间,并从 date_trunc 函数中获取它,例如 select date_trunc('hour', first_date).......... from my_table, (select min(insert_time) as first_date from .....) a where.... group by 1, 2 .....

标签: sql postgresql


【解决方案1】:

一种方法是首先读取第一条记录的时间戳。然后从其他值中减去它,截断到一小时的精度并加回来。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多