Functinal Selectの使い方
[kx wiki のページ]
http://code.kx.com/wiki/JB:QforMortals/queries_q_sql#Functional_select
http://code.kx.com/wiki/JB:QforMortals2/queries_q_sql#Functional_select
[サンプルテーブル]
q) meta MarketData
c | t f a
--------------| -----
date | d
sym | s p
time | t
bid | f
ask | f
marketDateTime| z
date sym time bid ask marketDateTime
----------------------------------------------------------------------
2014.01.02 USDJPY 07:00:02.111 105.231 105.271 2014.01.02T07:00:02.022
2014.01.02 USDJPY 07:00:05.222 105.232 105.272 2014.01.02T07:00:05.044
2014.01.02 USDJPY 07:00:05.333 105.233 105.273 2014.01.02T07:00:05.066
[使い方]
//
//###
// Functional Select
//
// @param t(symbol) - table name
// @param c(List) - c is a list of where specifications (constraints)
// @param b(Dict of List) - b is a dictionary of grouping specifications (by phrase)
// @param a(Dict of List) - a is a dictionary of select specifications (aggregations)
// @return Table
//#
t: `MarketData;
c: enlist ( <; `marketDateTime; `datetime$2014.01.05 );
b: (enlist `time) ! (enlist (`marketDateTime)); // just by
a: (enlist `price) ! enlist (last;`bid);
?[t;c;b;a]
// Other Samples
// 2 conditions
c: ( (=; `date; 2014.01.02);(=; `sym; enlist `GBPJPY) );
// This phrase is equal to " by `datetime$ 0D00:00:01 xbar `timestamp$`marketDateTime "
b: (enlist `time) ! (enlist (`timestamp$;`marketDateTime)); //
b: (enlist `time) ! (enlist (`datetime$ 0D00:00:01 xbar `timestamp$;`marketDateTime) ); // cast to datetime
// return 2 cols
a: `bid`ask ! ((last;`bid);(last;`ask));
c: (条件演算子・関数; カラム; 条件) のリスト
条件がsymbolの場合、そのままではだめっぽい。とりぜえずlistにするとOKだった。
b: (出力カラム名 ! by条件のリスト) のDict
by条件リストの書式は(条件; カラム名)。条件はなくても可,
特にbyでまとめる必要が無い場合は、0bを指定すればよい
a: (出力カラム名 ! 出力元カラム条件のリスト) のDict
出力元カラム条件のリストの書式は (条件演算子・関数; カラム名)。条件はなくても可
複数カラムを組み合わせるやり方は不明。。。
[Functional Selectの作り方例]
作成したいFunctional Selectと同様のselect文をstring形式で作成し、
parseするとFunctional Selectと同様の形式に展開される
q) parse "select from t"
?
`t
()
0b
()
/ 1行で書くと、(?;`tab;();0b;()) となる。2つめからそれぞれ、t,c,b,a
/ つまり、?[`t;();0b;()] と書けばよい