我在 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/