2015-03-19 68 views
1

這是表PostgreSQL中:如何計算SQL中時間範圍的最大行數?

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)

回答

0

使用查找感興趣的不同的時間戳。 UNION ALL,計算這些時間戳的活動用戶數:

select ts, 
     (select count(*) from login_log t2 
     where timestamps.ts between t2.login_start and t2.login_end) as count 
from (select login_start as ts 
     from login_log 
     union all 
     select login_end 
     from login_log) as timestamps 
order by count desc 
fetch first 1 row only 

最後訂單降序只選擇最高值!

(從非PostgreSQL用戶,所以有些細節可能是錯誤的...請評論,如果是這樣的話,我會編輯!)

2

使用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

相關問題