2010-02-26 2 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

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

Поскольку я не знаю вертику, у меня нет полного ответа на этот вопрос.

0

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

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

Существует, вероятно, функция типа DateDiff вы можете использовать. (К сожалению, у меня нет времени, чтобы посмотреть его.) Функция

0

См Vertica

TimeSeries Статья

Обеспечивает восполнение пробелов и интерполяции (GFI) вычисление, является важным компонентом вычисление временных рядов аналитики. Подробные сведения и примеры см. В разделе Использование аналитики Time Series в Руководстве для программистов.

Синтаксис

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.

Идея состоит в том, чтобы сначала создать ваши часовые фрагменты времени, затем тета присоединиться, чтобы найти (и отключить) для всех возможных совпадений на этом. Это в основном ищет все перекрытия временного диапазона. К счастью, это довольно просто, так как он находится где угодно до начала среза, а время окончания больше, чем начало среза.

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

См. Ниже пример.

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 

Возможно, имеются некоторые кромки или дополнительная фильтрация, если ваши данные не такие чистые.

 Смежные вопросы

  • Нет связанных вопросов^_^