私は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)
余分な例をありがとう –
@Chromozorz答えに追加するには。この例の最終的な出力は、各右の 'select from tab 'のように、/ :(" Robert ";" John ")のような名前を使用しても達成できます。私。どこの名前(各右)の名前リストのようなところ – davidcrossey
はい、それはデータとparamsに応じて結果を達成するより良い方法かもしれません...それは概念を説明するための単なる例でした – Chromozorz