postgresql - 按日期范围对结果进行分组

标签 postgresql date group-by timestamp range

我在 PostgreSQL 中有一个包含 timestamp 列的表,需要以 24 小时为间隔计算交互次数。示例数据:

CREATED
-----------------
2019-04-03 17:20:50
2019-04-03 17:20:59
2019-04-03 18:41:18
2019-04-04 09:58:49
2019-04-04 09:58:53
2019-04-04 09:58:59
2019-04-04 10:01:55
2019-04-04 14:52:52
2019-04-04 15:10:43
2019-04-04 15:10:53
2019-04-04 17:15:39

预期结果:

MIN(CREATED)            MAX(CREATED)          TOTAL
2019-04-03 17:20:50     2019-04-04 17:15:39   11

我目前有这个脚本,我将日期转换为秒,但我得到以下信息:

SELECT
    TIMESTAMP WITH TIME ZONE 'epoch' +
    INTERVAL '1 second' * trunc(extract('epoch' from created) / 86400) * 86400 as filtro,
    min(created),
    max(created),
    count(*)
FROM whts
GROUP BY filtro
ORDER BY max(created) desc;

FILTRO                      MIN(CREATED)                MAX(CREATED)                TOTAL
2019-04-04 00:00:00.000000  2019-04-04 09:58:49.000000  2019-04-04 17:15:39.000000  8
2019-04-03 00:00:00.000000  2019-04-03 17:20:50.000000  2019-04-03 18:41:18.000000  3

它应该返回一行,因为第一个 created 是:2019-04-03 17:20:50 和最后一个 2019-04-04 17:15:39。没有 24 小时过去。

最佳答案

SELECT min(created)
     , max(created)
     , count(*)
FROM   whts
GROUP  BY date_trunc('day', created - time '17:20:50')  -- time of the start
ORDER  BY max(created) DESC;

基本技巧是减去开始的时间分量(移动值以适应每日网格),然后你可以只使用 date_trunc()组成小组。

确定偏移量的最佳方法取决于任务的缺失定义......从哪里开始或结束?

从表中最早的 created 开始:

SELECT min(created)
     , max(created)
     , count(*)
FROM   whts, (SELECT min(created)::time FROM whts) t(t_start)
GROUP  BY date_trunc('day', created - t.t_start) 
ORDER  BY max(created) DESC;

关于postgresql - 按日期范围对结果进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55526940/

相关文章:

postgresql - 如何过滤 RETURNING *?

postgresql - 在带有 MacPorts 的 Snow Leopard 上使用 postgresql84 和 postgis 时没有 liblwgeom

JavaScript 简单日期验证

JavaScript 出生日期验证

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

mysql - 如何获取所有数据库的总大小

postgresql - Postgres : order of index

php - 如何使用 PHP 显示 postgresql 搜索结果

javascript - 在 Bootstrap 3 Datetimepicker 中禁用 future 日期

php - 通过 "SELECT"命令选择每组的前两条记录的最佳方法是什么?