2016-11-21 13 views
2

との時系列データからのカウントのヒストグラムは、私は、一見シンプルなもの作りたかったまで、私は、非常によくSQLを知っていると思った:idでアイテム数を示しにVertica SQL:ギャップ

  • 集約されたヒストグラムを。
  • を等時間間隔で1分ずつ分配した。
  • すべてのIDのヒストグラムには同じ時間間隔とスロットが必要です。
  • そのようなタイムスロットにエントリがない場合、ギャップは0で埋められる必要があります。
  • 合計数の順序で並べ替えられます。

Verticaでこれを行うための基本的な集約関数が必要であると思いますが、ここではSQLで思いつくのが最高です。特に多くのデータでは、このアプローチは実際には悪いことです。なぜなら、それは宇宙の量のメモリを食べるからです(CROSS JOINビーストに気づく)。

入力データ:アイテムの

Input Data

表(繰り返しているID、のcreated_at)

CREATE TABLE items(id int, created_at timestamp); 

INSERT INTO items(id, created_at) VALUES (1, '2016-01-02 00:00:00'); 
INSERT INTO items(id, created_at) VALUES (1, '2016-01-02 00:01:01'); 
INSERT INTO items(id, created_at) VALUES (2, '2016-01-02 00:05:10'); 
INSERT INTO items(id, created_at) VALUES (2, '2016-01-02 00:05:12'); 
INSERT INTO items(id, created_at) VALUES (3, '2016-01-02 00:05:01'); 
INSERT INTO items(id, created_at) VALUES (3, '2016-01-02 00:05:04'); 
INSERT INTO items(id, created_at) VALUES (3, '2016-01-02 00:05:30'); 
INSERT INTO items(id, created_at) VALUES (3, '2016-01-02 00:02:05'); 
INSERT INTO items(id, created_at) VALUES (3, '2016-01-02 00:20:02'); 

予期される結果:

Histogram

これいSQLクエリのマイバージョン:

(私は今、本当に恥ずかしい...)

考慮

SELECT 
    a.id, 
    sum(a.count) AS total_count, 
    agg_concatenate(a.count||',') AS histogram 
FROM (
    SELECT 
     i.id, 
     times.ts, 
     nvl(counts.count,0) AS count 
    FROM (
     SELECT ts FROM (
      SELECT '2016-01-02 00:00:00'::TIMESTAMP AS tm 
      UNION ALL 
      SELECT '2016-01-02 00:20:00'::TIMESTAMP AS tm 
     ) t 
     TIMESERIES ts AS '1 minute' OVER (ORDER BY tm)) times 
    CROSS JOIN (
     SELECT DISTINCT id FROM items 
     ) i 
    LEFT OUTER JOIN (
     SELECT 
      time_slice(created_at, 1, 'MINUTE') AS ts, 
      id, 
      count(*) AS count 
     FROM 
      items 
     GROUP BY 
      1,2) counts ON counts.ts=times.ts AND counts.id=i.id 
    ORDER BY 1,2 
) a 
GROUP BY 
    a.id 
ORDER BY 
    2 DESC; 

他の可能性のコースオフがありますがカスタムVertica User Defined ExtensionをJavaやC++などの言語で書く代わりに、それを実行する前に、私がsomを見逃していないことを確認したい簡単な解決法、それを行う方法。

あなたがにVerticaの専門家であるか、よりよい解決策を知っている場合にVerticaは...もしかしたら、私はマニュアルを読んで十分に注意しないし、

1は、このようなものが存在して期待されるデータ・ベース・プラットフォームの一種であります単純なSQLでは、それを見つけるのがいいでしょう。 これについて既存のUDXを知っていても、参考になります。主なもの - これはできるだけデータに近づけて計算したいと思っています。

ありがとうございます!

マリス

答えて

0

これは悪くはありません。私はあなたのヒストグラムフィールドのいずれかの任意のエレガントな回避策を知っていない:

agg_concatenate(a.count||',') 

主なものを - 私は、これは可能な限りデータの近くのように計算することにしたいです。

このような連結は、必要に応じてExcelやSQLの外で行ったことですが、データがどこにクランチされているかについて特別な制約があることを理解する必要があります。

クエリのパフォーマンスは、お客様のニーズなどによって実際に低速ですか?

関連する問題