这是Postgresql中的表:
mydb=# \d login_log
Table "public.login_log"
Column | Type | Modifiers
-------------+--------------------------+-----------
id | integer |
login_start | timestamp with time zone |
login_end | timestamp with time zone |
某些行:
1 | 2015-03-19 10:00:00 | 2015-03-19 13:30:00
2 | 2015-03-19 10:20:00 | 2015-03-19 13:20:00
3 | 2015-03-19 13:00:00 | 2015-03-19 16:00:00
4 | 2015-03-19 13:10:00 | 2015-03-19 16:00:00
5 | 2015-03-19 14:30:00 | 2015-03-19 15:30:00
6 | 2015-03-19 15:00:00 | 2015-03-19 15:30:00
7 | 2015-03-19 12:00:00 | 2015-03-19 18:00:00
我需要一个SQL来计算在哪个时间范围内有最大记录用户。
在上面的例子中,结果是:
在时间范围内:
2015-03-19 13:10:00 ~ 2015-03-19 13:20:00
,5个用户登录。(1,2,3,4,7)
最佳答案
使用range types(将其构建为“动态”)。它们提供了很多有用的functions and operators。您只需要定义一个custom aggregate,它将为您提供整个交叉口。所以-你会得到这样的结果:
with common as (
select (intersection(tsrange(login_start, login_end))) as period
from login_log
)
select
-- common.period,
-- array_agg(id)
*
from common, login_log
WHERE tsrange(login_start, login_end) && common.period
-- GROUP BY common.period
/*
for some reason, when uncommenting the "^--..." lines,
and commenting the "*" one - sqlfiddle shows an empty result.
Nevertheless it works on my local posgres...
*/
参见工作示例:http://sqlfiddle.com/#!15/0c9c6/10