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
4

4 回答 4

0

Vertica 基于 PostgresSQL,尤其是在语言方面。您可以做的最好的事情是查找 Postgres 的日期时间函数和相关教程。我还没有找到 Postgres 时间函数在 Vertica 中不起作用的实例。

http://www.postgresql.org/docs/8.0/interactive/functions-datetime.html

您可能可以使用 datediff 类型的函数。(对不起,我没时间查。)

于 2010-03-25T21:12:53.333 回答
0

您需要一个包含每小时的表,以便您可以加入它。该加入将基于开始和结束时间之间的小时,然后您可以使用 (min(hour end,end time) - max (小时开始,开始时间))。然后按小时分组并求和。

由于我不了解vertica,因此我对此没有完整的答案。

于 2010-02-26T20:14:51.477 回答
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 [ , ... ] ]
于 2012-12-18T17:43:54.210 回答
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

如果您的数据不那么干净,可能会有一些边缘情况或需要额外的过滤。

于 2016-06-29T16:20:21.640 回答