2017-05-18 3 views
1

人生のqから、私はこれを読む方法を理解するのに苦労し、論理的に理解しています。kdbで各右と左をどのように組み合わせて読むかを理解する

1 2 3,/:\:10 20 

結果は、完全な形式のクロス製品であることを理解しています。raze 1 2 3,/:\:10 20

しかし、左から右に読んで、私は現在、どのようなこの利回り(私の頭の中で)1 2 3,/:と組み合わせる

\:10 20 

を理解することで迷ってしまいました??

これを明確に(単語または明確なロジックで)読む方法を理解する助けになります。

答えて

4

私はqの構文をプログラムしている間、私の頭の中で次のように言っていました。 qは右から左に作用する。

Internal Monologue -> Join the string on the right onto each of the strings on the left 
code ->    "ABC",\:"-D" 
result ->    "A-D" 
         "B-D" 
         "C-D" 

私はそれを理解するのが簡単だと思います。 '結合'は何でも置き換えることができます...

それぞれの権利は同じ概念であり、それらを組み合わせることも簡単です。

Internal Monologue -> Does each of the strings on the right match each of the strings on the left 
code ->    ("Cat";"Dog";"CAT";"dog")~\:/:("CAT";"Dog") 
result ->    0010b 
         0100b 

だから、1 2 3,/:\:10 20あなたの例では - あなたは「左の要素のそれぞれに、右側の要素のそれぞれに参加し」言っている

・ホープ、このことができます!現実世界の例を追加するには

EDIT .... - 私はあなたが行うことができ、名前はロバートあるすべてのレコードを取得したい、次の表に

q)show tab:([] upper syms:10?`2; names:10?("Robert";"John";"Peter";"Jenny"); amount:10?til 10) 
syms names amount 
-------------------- 
CF "Peter" 8 
BP "Robert" 1 
IC "John" 9 
IN "John" 5 
NM "Peter" 4 
OJ "Jenny" 6 
BJ "Robert" 6 
KH "John" 1 
HJ "Peter" 8 
LH "John" 5 
q) 

を検討します。 select from tab where names like "Robert"

しかし、名前がロバートかジョンかの結果を得たい場合は、それぞれの左と右のそれぞれを使用するのが最適なシナリオです。

名前列は、文字列のリスト(各要素が文字のリストであるリスト)です。私たちが尋ねたいのは、「名前列の文字列のどれかが、見つけたい文字列のどれかに一致していますか?」ということです。それは(namesList)~\:/:(list;of;names;to;find)に変換されます。ここにはステップがあります。あなたは両方のリストのインデックス1を見れば、たとえば、それはロバートと0Bのため1bのだ - 私たちは、各要素がそれを真実であるブール値のコンパイルリストは、ロバート・OR・ジョンのために真で欲しいという結果から、

q)(tab`names)~\:/:("Robert";"John") 
0100001000b 
0011000101b 

ジョンの場合 - 結果では、インデックス1の値は1bでなければなりません。インデックス2は1b、インデックス3は1b、インデックス4は0bなどとする必要があります。これを行うには、any関数(またはmaxまたはsum!)を適用します。結果は次にあります。

q)any(tab`names)~\:/:("Robert";"John") 
0111001101b 

これをまとめて、

q)select from tab where any names~\:/:("Robert";"John") 
syms names amount 
-------------------- 
BP "Robert" 1 
IC "John" 9 
IN "John" 5 
BJ "Robert" 6 
KH "John" 1 
LH "John" 5 
q) 
+0

余分な例をありがとう –

+0

@Chromozorz答えに追加するには。この例の最終的な出力は、各右の 'select from tab 'のように、/ :(" Robert ";" John ")のような名前を使用しても達成できます。私。どこの名前(各右)の名前リストのようなところ – davidcrossey

+0

はい、それはデータとparamsに応じて結果を達成するより良い方法かもしれません...それは概念を説明するための単なる例でした – Chromozorz

1

まず、qは右から左に実行される(したがって一般的には読み込まれる)。つまり、\:を修飾子として解釈して、それ自体が/:副詞によって変更された単純な結合である、前の関数に適用されることを意味します。したがって、これを読み取る方法は、「左辺の各引数にそれぞれ右辺を適用する」です。

この場合、2つの副詞を結合に適用しています。\:10 20は、ここで実際の意味がありません。

逆のケース1 2 3,\:/:10 20を見て、そのコードを実行すると2x6の行列が生成され、「右辺の各引数にそれぞれ左辺を適用する」のように記述すると便利です。理にかなった希望。

,/:\:[1 2 3;10 20]の代替構文もあります。これは、適用している機能が何であるかを明確にし、インプレース表記法と同等です。

関連する問題