当前位置: 首页 > 知识库问答 >
问题:

按60分钟的持续时间对记录进行分组,从第一条记录的时间戳开始算起

柏修洁
2023-03-14

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

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

这将记录分为一个小时窗口,每个小时窗口从第0分钟开始。

这个需求的一点背景:我有一个自动测试,它会导致数据库被填充。在我的测试开始之前,数据库可能已经有了一些记录。我的自动测试的目标是每小时完成一定数量的任务。我正在寻找一种方法来验证我的测试的准确性,方法是在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个答案

戚均
2023-03-14

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

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

 类似资料:
  • 问题内容: 我有一个包含datetime列和一些其他列的表。datetime列表示发生的事件。它可以包含一个时间(事件在那个时间发生)或NULL(事件没有发生) 我现在想计算在特定时间间隔(15分钟)内发生的记录数,但是不知道该怎么做。 例子: 现在,我想创建一个查询,该查询将创建类似于以下内容的结果集: 这在SQL中可能吗,或者有人可以建议我可以使用哪些其他工具?(例如,将数据导出到电子表格程序

  • 问题内容: 我有一个这样的表: 我需要一个查询以n分钟的间隔对记录进行分组。 例如,输出(按60分钟分组): 到目前为止,由于间隔介于0到60分钟之间,因此我一直在使用此查询按10分钟间隔进行分组: 但是现在间隔可以是例如 125436758 分钟。 我无法创建新表,并且用户定义的间隔必须为n分钟。我正在使用SQL SERVER2012。谢谢。 问题答案:

  • 我有一个测试数据库,每个测试都有一个StartTime和(对于那些完成的)EndTime值。我想创建一个查询,显示每小时运行的测试数量。 i、 e.在任何给定时间有开始时间但没有结束时间的测试。 我解决了分组问题——感谢@p.cambell对问题SQL Server Group by Count of DateTime Per Hour的回答?

  • 从test1中选择(Sold_date-to_date('1970-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))*86400作为epoch_sold_date;

  • 我得到的数据集如下所示: 我想按时间字段对其进行分组,并获取每个时间间隔的MAX(openBid),并拥有最后5个间隔(在本例中为5分钟)。我使用这个查询: 结果如下: 我遇到的问题是,随着时间的推移,结果集中第一条记录的计数从1增加到5。在这个例子中,它是3。我希望我的查询在所有时间间隔内都有相同数量的记录。我认为问题是GROUP BY准时从集合的第一条记录开始。由于我正在执行ORDER BY

  • 问题内容: 我有一个可能每天运行几次的应用程序。每次运行都会生成写入表的数据,以报告发生的事件。主报告表如下所示: 我可以说有两次运行,但是我想要一种能够查询日期范围(运行过程的次数)的方法。我想查询一个查询,该查询导致进程开始的时间和组中的文件数。这种查询可以让我了解我想要的东西,因为我可以看到什么日期和时间以及运行了多少文件,但不完全是我想要的。例如,它不能适应从8:58到9:04的运行。例如