2015-06-26 64 views
0

我正在尝试获取给定间隔的项目数,但没有指定开始或停止时间。我会想象你可以用窗口函数来做,但我不太确定如何去做。Postgres按时间间隔计数项目

问题如下我想获得在给定的任意间隔20分钟内人们登录网站的次数。

实施例A

 1. 2015-06-24 23:00:00 
    2. 2015-06-24 23:45:00 
    3. 2015-06-25 00:00:00 
    4. 2015-06-25 00:15:00 
    5. 2015-06-25 00:17:00 
    6. 2015-06-25 00:21:00 

在上述例子中我要强调项目(2,3),(3,4,5),(4,5,6),(5,6)的输出我想是

start,end,count 
2015-06-25 23:45:00,2015-06-25 00:00:00,2 
2015-06-25 00:00:00,2015-06-25 00:17:00,3 
2015-06-25 00:15:00,2015-06-25 00:21:00,3 

而且只保留其中数> = 2,否则一切都将是一个有效的分组

现在数据是窗口函数的方式,我应该去,CTE或者是有其他的做法采用?

+0

这些窗口是固定的还是浮动的?如果你有'6。 2015-06-25 01:21:00',它会如何改变结果? – Quassnoi

+0

如果是这样的话,那么结果会批量生成(2,3),(3,4,5)我猜我错过的是计数大于等于2的情况,否则一切都会被捕获 – sqwale

+0

为什么3会进入分成两组? – Quassnoi

回答

1

尝试此查询与自联接:

select a.id, a.log_at, max(b.log_at), count(1) 
from logs a 
join logs b on b.log_at >= a.log_at and b.log_at <= a.log_at+ '20 m'::interval 
group by 1, 2 
having count(1) > 1 
order by 1 
+0

非常感谢!它的作品我现在甚至不担心表演会在未来的工作。 – sqwale

+2

如果查询速度太慢(对于大量数据),首先在'log_at'上创建一个索引。 – klin

0

你可以像查询得到与计数每“日”组:

SELECT MIN(last_seen_at), MAX(last_seen_at), COUNT(*) 
FROM user_kinds 
GROUP BY DATE(last_seen_at) 
ORDER BY DATE(last_seen_at) DESC LIMIT 5; 

这对我的样本数据集产生类似的结果:

2015-06-26 00:12:30.476548 | 2015-06-26 22:06:25.134322 | 69 
2015-06-25 00:46:03.392651 | 2015-06-25 23:49:46.616964 | 14 
2015-06-24 14:22:33.578176 | 2015-06-24 23:39:01.32241 | 10 
2015-06-23 01:42:53.438663 | 2015-06-23 20:12:21.864601 |  2 
(5 rows) 
+0

如果有人在2015-06-23 23:59:00登录然后2015-06-24 00:10:00他们每天会显示1的计数。甚至认为他们在20分钟内。 – sqwale