2010-02-26 104 views
1

我正在使用Vertica數據庫。我試圖從以下示例會話數據中獲取特定小時內的總秒數。任何樣本SQL代碼將是非常有益的 - 感謝給定開始時間,結束時間和秒數。在特定小時內獲取秒數

  start time  end time   session length(secs) 
2010-02-21 20:30:00  2010-02-21 23:30:00 10800 
2010-02-21 21:30:00  2010-02-21 22:30:00  3600 
2010-02-21 21:45:00  2010-02-21 21:59:00  840 
2010-02-21 22:00:00  2010-02-21 22:20:00  1200 
2010-02-21 22:30:00  2010-02-21 23:30:00  3600 

所需的輸出

hour secs_in_that_hour 
20   1800 
21   6240 
22   8400 
23   3600 

回答

0

您將需要一個包含每個小時的表,這樣你就可以加入進來嗎?那加盟將基於的。小時在開始和結束時間內,然後可以使用(min(小時結束,結束時間) - max(小時開始,開始時間))提取時間。然後按小時和總計。

由於我不知道vertica,我沒有完整的答案。

0

見Vertica的功能

時間序列第

提供縫隙填充和插值(GFI)計算的一個重要組成部分時間序列分析計算。有關詳細信息和示例,請參閱「程序員指南」中的使用時間序列分析。

語法

TIMESERIES slice_time AS 'length_and_time_unit_expression' OVER (
... [ window_partition_clause (page 147) [ , ... ] ] 
... ORDER BY time_expression) 
... [ ORDER BY table_column [ , ... ] ] 
0

最簡單的方法是隻提取關於間隔(時間戳之間的差)曆元(秒數)。

至於重疊的總和,你需要先按小時劃分。其中一些小時不存在,因此您需要使用TIMESERIES子句生成它們。

這個想法將首先創建你的小時間片,然後theta加入找到(並扇出)所有可能的匹配。這基本上是尋找時間範圍的任何和所有重疊。幸運的是,這很簡單,因爲它只是開始時間在切片結束之前的任何位置,並且結束時間大於切片的開始時間。

然後,您使用最大和最小值來查找切片內啓動和停止的實際時間,將它們減去,將間隔轉換爲秒並完成。

查看下面的例子。

with slices as ( 
    select slice_time slice_time_start, slice_time + interval '1 hour' slice_time_end 
    from (
    select min(start_time) time_range from mytest 
    union all 
    select max(end_time) from mytest 
) range 
    timeseries slice_time as '1 HOUR' over (order by range.time_range) 
) 
select slice_time_start "hour", extract(epoch from sum(least(end_time, slice_time_end)-greatest(slice_time_start, start_time))) secs_in_that_hour 
from slices join mytest on (start_time < slice_time_end and end_time > slice_time_start) 
group by 1 
order by 1 

可能有一些邊緣情況,或者如果您的數據不那麼幹淨,則需要額外的過濾。

相關問題