2017-09-27 3 views
1

でJSONを使用した場合、アレイ内のタグでフィルタリングする方法。 私がスノーフレークのタグとJSON配列を使用する必要があります表示されます。私はすべての時系列の各時点は、タグの任意のセットで標識された時系列、数百万を保存するスノーフレーク

CREATE TABLE timeseries (obj_id INT, ts DATE, tags VARIANT, val INT) 
INSERT INTO timeseries (obj_id, ts, tags, val) VALUES (442243, '2017-01-01', parse_json('["red", "small", "cheap"]'), 1) 
INSERT INTO timeseries (obj_id, ts, tags, val) VALUES (673124, '2017-01-01', parse_json('["red", "small", "expensive"]'), 2) 
INSERT INTO timeseries (obj_id, ts, tags, val) VALUES (773235, '2017-01-01', parse_json('["black", "small", "cheap"]'), 3) 

今、私は、例えば、「小」AND「安い」とラベルされたすべての時系列の平均を見たいです

返す
SELECT ts, AVG(val) 
FROM timeseries 
WHERE "small" IN tags AND "cheap" IN tags 
GROUP BY ts 

ts, avg(val) 
2017-01-01, 2 

、それを達成するために、右スノーフレーク構文/スキーマ/アプローチは何ですか? 注:私は、行を爆発させたくないので、私はちょうど「安い」と「小さい」でないすべての行を除外したいと思います。

答えて

1

ではなくJSONを使用して、あなたは、例えば、直接配列型を使用することができます。:

CREATE TABLE ts2 (obj_id INT, ts DATE, tags ARRAY, val INT); 
INSERT INTO ts2 (obj_id, ts, tags, val) select 442243, '2017-01-01', ARRAY_CONSTRUCT('red', 'small', 'cheap'), 1; 
INSERT INTO ts2 (obj_id, ts, tags, val) select 673124, '2017-02-01', ARRAY_CONSTRUCT('red', 'small', 'expensive'), 2; 
INSERT INTO ts2 (obj_id, ts, tags, val) select 773235, '2017-01-01', ARRAY_CONSTRUCT('black', 'small', 'cheap'), 3; 

VALUES句は、ARRAY_CONSTRUCTなどの機能を使用することはできませんが、INSERT-SELECTで動作します。 (これはJSONとVARIANT型でも可能ですが、キー名で値にタグを付け、挿入物にPARSE_JSONを使用する必要があります)。

次に両方のタグ次のようなクエリを使用してください:

select 
    obj_id, 
    tags 
from ts2 
where ARRAY_CONTAINS('small'::variant, tags) 
    and ARRAY_CONTAINS('cheap'::variant, tags) 
; 
+0

ありがとうございます!私はそれを試してみましょう! –

+0

ARRAY_CONTAINSはAndreyのデータロード方法、btwでも動作するはずです。 –

+0

本当に!その機能は、先週のSnowflakeで利用できるようになりました:) –