在postgresql中,如何找到基于时间范围的聚合

时间:2016-09-20 16:41:27

标签: postgresql time range

例如,如果我有一个在柜台上完成的交易的数据库表。我想搜索是否有任何时间被定义为非常繁忙(在10分钟内处理超过10次交易)。我该怎么去查询呢?我可以根据时间范围汇总并计算这些范围内的交易ID数量吗?

添加示例以阐明我的输入和所需的输出:

+----+--------------------+
| Id | register_timestamp |
+----+--------------------+
| 25 | 08:10:50           |
| 26 | 09:07:36           |
| 27 | 09:08:06           |
| 28 | 09:08:35           |
| 29 | 09:12:08           |
| 30 | 09:12:18           |
| 31 | 09:12:44           |
| 32 | 09:15:29           |
| 33 | 09:15:47           |
| 34 | 09:18:13           |
| 35 | 09:18:42           |
| 36 | 09:20:33           |
| 37 | 09:20:36           |
| 38 | 09:21:04           |
| 39 | 09:21:53           |
| 40 | 09:22:23           |
| 41 | 09:22:42           |
| 42 | 09:22:51           |
| 43 | 09:28:14           |
+----+--------------------+

所需的输出类似于:

+-------+----------+
| Count |   Min    |
+-------+----------+
|     1 | 08:10:50 |
|     3 | 09:07:36 |
|     7 | 09:12:08 |
|     8 | 09:20:33 |
+-------+----------+

2 个答案:

答案 0 :(得分:1)

这个怎么样:

SELECT time,
FROM (
    SELECT count(*) AS c, min(time) AS time
    FROM transactions
    GROUP BY floor(extract(epoch from time)/600);
)
WHERE c > 10;

这将找到在该时间间隔内发生超过10次交易的所有十分钟间隔。它假定该表名为transactions,并且它有一个名为time的列,其中存储了时间戳。

答案 1 :(得分:0)

感谢redneb,我最终得到了以下查询:

SELECT count(*) AS c, min(register_timestamp) AS register_timestamp
FROM trak_participants_data
GROUP BY floor(extract(epoch from register_timestamp)/600)
order by register_timestamp

它足够接近让我能够分辨出哪个时间块是计数器中最繁忙的。