Заданные время начала, время окончания и сек. Получить секунды в определенный час - PullRequest
1 голос
/ 26 февраля 2010

Я использую базу данных 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 ]

0 голосов
/ 29 июня 2016

Самый простой способ - просто извлечь эпоху (количество секунд) на интервале (разницу между временными метками).

Что касается перекрывающихся сумм, вам нужно сначала разбить их на час. Некоторые из этих часов не существуют, поэтому вам нужно сгенерировать их, используя предложение 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

Там могут быть некоторые крайние случаи или поэтому необходима дополнительная фильтрация, если ваши данные не так чисты.

0 голосов
/ 26 марта 2010

Vertica основана на PostgresSQL, особенно с точки зрения языка. Лучшее, что вы можете сделать, - это посмотреть функции Dategres Date Time и соответствующие руководства. Я не нашел случая, когда функция времени Postgres не работает в Vertica.

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

Возможно, вы можете использовать функцию типа datediff. (Извините, у меня нет времени искать это.)

0 голосов
/ 18 декабря 2012

См. Функцию 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 [ , ... ] ]
0 голосов
/ 26 февраля 2010

Вам понадобится таблица, содержащая каждый час, чтобы вы могли присоединиться к ней. Это объединение будет основываться на часах, находящихся в пределах времени начала и окончания, а затем вы можете извлечь время, используя (мин (конец часа, время окончания ) - максимум (час начала, время начала)). Затем группа по часам и сумме.

Так как я не знаю vertica, у меня нет полного ответа на это.

...