2017-09-07 5 views
1

クエリで関数を使用する方法がkdbにありますか。私は列の0または1の代わりにwhere節の関数を使用するKDB

select where ((red=1) or (green=1)) 

を問い合わせるが、私は選択をフィルタリングするために

isRG:{((select green from x)=1) or ((select red from x)=1)} 

のような機能を使用することができます値のいずれか含まれてい

`red`blue`green`yellow`white`purple 

を持つテーブルがあると仮定? 私は

f:[select from t] 

を行うことができますし、それが真と偽で列を返しますが、私はここで、f(x)のすべてのエントリを取得するために

select from t where f[select from t] 

の線に沿って何かをする方法を見つけ出すカントが真実です

+0

Jブール値またはブール値のリストに評価される場所のどこにでもあるかどうかを確認してください。 – Chromozorz

答えて

2

はい - 関数全体にテーブルを渡す必要はありませんが、関連する列:

選択中
/ define a table 
tbl:flip`red`blue`green`yellow`white`purple!(0N;6)#36?0b; 
    red blue green yellow white purple 
    ---------------------------------- 
    1 0 0  0  1  1  
    1 0 0  0  0  1  
    1 0 0  0  0  0  
    0 0 1  0  0  0  
    1 1 0  0  0  0  
    0 0 0  0  1  0  

/define a function to work on 2 columns - this func simply does or between the columns 
f:{[column1;column2] column1|column2}; 

/use function on 2 columns of table 
select from tbl where f[red;green] 
    red blue green yellow white purple 
    ---------------------------------- 
    1 0 0  0  1  1  
    1 0 0  0  0  1  
    1 0 0  0  0  0  
    0 0 1  0  0  0  
    1 1 0  0  0  0  

機能を使用する場合に重要な原則は、心に留めておくべきwhere句がある:各列引数がベクトル

  • として渡され

    • 関数が返す値でなければなりませんブール値のベクトル(またはブール値に相当する型。整数は0とみなされます)は、同じ長さの
  • 1

    このシナリオでは辞書を使用する方が簡単です。以下tflipを使用して:

    q)t 
    red blue green yellow white purple 
    ---------------------------------- 
    0 1 0  1  1  0 
    q) 
    q)(key[x:flip[t]] where (raze value x=1))#x 
    blue | 1 
    yellow| 1 
    white | 1 
    

    enlistそれはあなたがテーブルとして結果たい場合:

    q)enlist (key[x:flip[t]] where (raze value x=1))#x 
    blue yellow white 
    ----------------- 
    1 1  1 
    

    を別の可能性がfunctional selectを使用し、どこのすべてのものに列名のリストをフィルタリングするかもしれません値は1に等しい。

    1

    これはいくつかのバリエーションが面白いかもしれません。

    foo:{[t;c] t where (|) over flip c#t} 
    

    c(列名)はリストである必要があります。以前の応答からTBLを使用して:あなたはwhere句の「生の」それらを使用することができるように

    foo[tbl;`red`blue] 
    
    1

    まず、列は、ブールベクトルです:

    q)tbl 
    red blue green yellow white purple 
    ---------------------------------- 
    0 0 1  0  0  0 
    1 0 1  1  0  0 
    1 0 1  1  1  0 
    0 0 0  0  0  0 
    0 1 0  0  1  1 
    1 0 1  1  0  0 
    q)select from tbl where red or green 
    red blue green yellow white purple 
    ---------------------------------- 
    0 0 1  0  0  0 
    1 0 1  1  0  0 
    1 0 1  1  1  0 
    1 0 1  1  0  0 
    

    あなたがあなた自身の関数を使用することができますwhere句?絶対に。

    functional selectを使用し、代わりにQ-SQL where句で使用するための関数を書くの、あなたの関数に 列名の引数を作るために、あなたの質問を越えてを行く
    q)isRG:{or/[x`red`green]} 
    q)isRG tbl 
    111001b 
    q)select from tbl where isRG tbl 
    red blue green yellow white purple 
    ---------------------------------- 
    0 0 1  0  0  0 
    1 0 1  1  0  0 
    1 0 1  1  1  0 
    1 0 1  1  0  0 
    

    。この場合、制約はparse treeと表示されます。 (or;`red;`white)

    q)?[tbl; enlist(or; `red; `white); 0b;()] 
    red blue green yellow white purple 
    ---------------------------------- 
    1 0 1  1  0  0 
    1 0 1  1  1  0 
    0 1 0  0  1  1 
    1 0 1  1  0  0 
    

    その後、列名parameteriseことができます。

    q)selEither:{[t; c1; c2] ?[t; enlist(or; c1 ;c2); 0b;()]} 
    q)selEither[tbl; `red; `white] 
    red blue green yellow white purple 
    ---------------------------------- 
    1 0 1  1  0  0 
    1 0 1  1  1  0 
    0 1 0  0  1  1 
    1 0 1  1  0  0 
    

    最後に、あなたはペアの列名のリストにこれを拡張することができます。

    q)selAny:{[tbl; cn] ?[tbl; enlist(or/;enlist,cn); 0b;()]} 
    q)selAny[t; `white`green`yellow] 
    … 
    

    もっと見ますKXテクニカルホワイトペーパーParse Trees and Functional Forms

    関連する問題