我正在使用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 :(得分:0)
您需要一个包含每小时的表格,以便您可以加入。该连接将基于开始和结束时间内的小时,然后您可以使用(min(小时结束,结束时间)提取时间) - 最大(小时开始,开始时间))。然后分组小时和总和。
由于我不知道vertica,我对此没有完整的答案。
答案 1 :(得分:0)
Vertica基于PostgresSQL,尤其是语言方面。您可以做的最好的事情是查找Postgres的日期时间函数和相关教程。我还没有找到Postgres时间函数在Vertica中不起作用的实例。
http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html
您可以使用日期类型函数。 (对不起,我没时间查阅。)
答案 2 :(得分:0)
请参阅Vertica功能
TIMESERIES条款
提供间隙填充和插值(GFI)计算,这是时间序列分析计算的重要组成部分。有关详细信息和示例,请参阅“程序员指南”中的使用时间序列分析。
语法
TIMESERIES slice_time AS 'length_and_time_unit_expression' OVER (
... [ window_partition_clause (page 147) [ , ... ] ]
... ORDER BY time_expression )
... [ ORDER BY table_column [ , ... ] ]
答案 3 :(得分:0)
最简单的方法是在间隔(时间戳之间的差异)上提取纪元(秒数)。
至于重叠的金额,你需要先按小时分解。其中一些时间不存在,因此您需要使用TIMESERIES
子句生成它们。
这个想法是首先创建你的每小时时间片,然后你就加入找到(并扇出)所有可能的匹配。这基本上是寻找时间范围的任何和所有重叠。幸运的是,这非常简单,因为它只是在切片结束之前的开始时间和结束时间大于切片开始的任何地方。
然后你使用最大值和最小值来找到在切片内开始和停止的实际时间,将它们减去,将间隔转换为秒并完成。
请参阅下面的示例。
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
如果您的数据不那么干净,可能会出现一些边缘情况或需要额外的过滤。