との時系列データからのカウントのヒストグラムは、私は、一見シンプルなもの作りたかったまで、私は、非常によくSQLを知っていると思った:idでアイテム数を示しにVertica SQL:ギャップ
- 集約されたヒストグラムを。
- を等時間間隔で1分ずつ分配した。
- すべてのIDのヒストグラムには同じ時間間隔とスロットが必要です。
- そのようなタイムスロットにエントリがない場合、ギャップは0で埋められる必要があります。
- 合計数の順序で並べ替えられます。
Verticaでこれを行うための基本的な集約関数が必要であると思いますが、ここではSQLで思いつくのが最高です。特に多くのデータでは、このアプローチは実際には悪いことです。なぜなら、それは宇宙の量のメモリを食べるからです(CROSS JOINビーストに気づく)。
入力データ:アイテムの
表(繰り返している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');
予期される結果:
これい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を知っていても、参考になります。主なもの - これはできるだけデータに近づけて計算したいと思っています。
ありがとうございます!
マリス