这是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

10-08 02:06