2017-12-01 3 views
0

私は1つの配列(UInt16)列を持つクリックハウステーブルを持っています。私はこのテーブルの結果をフィルタリングして、配列列の値がしきい値を上回る行だけを取得できるようにしたい。私はいくつかの配列関数(arrayFilterとarrayExists)を使用してこれを達成しようとしてきましたが、私はSQL/Clickhouseのクエリ構文に慣れていないので、この作業ができません。私が使用してテーブルを作成しましたどのように配列の内容でクリックハウステーブルをフィルタリングするのですか?

:距離値は、日付の後に秒の一定量(sessionSecond)での特定のポイントからの距離になります

CREATE TABLE IF NOT EXISTS ArrayTest (
    date Date, 
    sessionSecond UInt16, 
    distance Array(UInt16) 
) Engine = MergeTree(date, (date, sessionSecond), 8192); 

。テーブルには、次のように見えるので、私はいくつかのサンプル値を追加しました:

Table with sample values

今、私は配列演算子のドキュメントhereを発見し、arrayExists機能を試してみました7.よりも距離が含まれているすべての行が大きい取得したいですしかし、それは私が期待していた方法で動作していない。ドキュメントから、この関数は、 'func'が0以外の何かを返す 'arr'に少なくとも1つの要素がある場合は1を返し、それ以外の場合は0を返します。私は私の下にクエリを実行すると、私は0と2のものを取得する必要がありしかし、3ゼロが返されます:

SELECT arrayExists(
    val -> val > 7, 
    arrayEnumerate(distance)) 
FROM ArrayTest; 

は最終的に私はこの選択を実行して持っている唯一のリターン行にテーブルの内容と、それに参加したいです存在は1ですが、私はその前に仕事をするためにこの最初のステップが必要です。 arrayExistsを間違って使用していますか?私がより混乱していると分かったのは、比較値を2に変更すると、すべてが1に戻ります。このようなフィルタリングは、配列関数を使用して達成できますか?

ありがとうございました

答えて

1

WHERE句では、arrayExistsを使用できます。あなたが7よりも大きい値を知る必要がある場合

SELECT * 
FROM ArrayTest 
WHERE arrayExists(x -> x > 7, distance) = 1; 

もう一つの方法は、ARRAY JOINを使用することです:

SELECT d, distance, sessionSecond 
FROM ArrayTest 
ARRAY JOIN distance as d 
WHERE d > 7 
+0

おかげミハイル、これは完璧に動作します。私は問題だと思った何らかの理由でarrayEnumerateを追加していました。私も配列のインデックスを照会できるかどうか疑問に思っていましたか?もし私がdistance [1]> 7かどうかを確認したいのであれば、これは配列の機能を誤って使用していて、代わりに列を使うべきですか? – MoshMcCabe

+1

はいアレイ内の特定の要素を確認できます 'SELECT * FROM ArrayTest WHERE distance [1]> 5' – Mikhail

+0

ありがとうMikhail。今のところ私は期待どおりに働いています。 – MoshMcCabe

関連する問題