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の日時関数と関連するチュートリアルを調べることです。VerticaでPostgres時間関数が機能しないインスタンスは見つかりませんでした。

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

おそらく、使用できるdatediffタイプの関数があります。(申し訳ありませんが、調べる時間はありません。)

于 2010-03-25T21:12:53.333 に答える
0

Vertica 関数を参照してください

TIMESERIES句

時系列分析計算の重要なコンポーネントであるギャップ充填および補間 (GFI) 計算を提供します。詳細と例については、『Programmer's Guide』の「Using Time Series Analytics」を参照してください。

構文

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

結合できるように、すべての時間を含むテーブルが必要になります。その結合は、開始時間と終了時間内にある時間に基づいており、(min(hour end,end time) - max を使用して時間を抽出できます。 (開始時間、開始時間))。次に、時間と合計でグループ化します。

私は vertica を知らないので、これに対する完全な答えはありません。

于 2010-02-26T20:14:51.477 に答える
0

最も簡単な方法は、間隔 (タイムスタンプ間の差) でエポック (秒数) を抽出することです。

重複する合計については、まず時間ごとに分割する必要があります。これらの時間の一部は存在しないため、TIMESERIES句を使用して生成する必要があります。

アイデアは、最初に 1 時間ごとのタイム スライスを作成し、次に 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 に答える