2016-09-20 66 views
0

我使用KDB和一個讓我設置查詢的工具。使用此工具,只有參數(過濾器值)可以隨用戶交互而改變,而不是查詢的結構。 我需要一個查詢在用戶操作上運行。默認情況下,我希望它選擇每一行,並且在他選擇了某些內容之後,我希望查詢按他的選擇進行過濾。從通配符中選擇,在Q KDB

例如: 默認: 從報價其中符號= *

用戶之後選擇一個符號選擇: 從報價其中符號=`AAPL

但是,默認實例沒有按」選擇因爲在KDB中沒有*通配符,與SQL不同。我怎樣才能默認獲得所有行呢?

回答

3

不確定你想要達到什麼,或者你的確切約束是什麼。

如果你說等於(=)是固定的,那麼你只能選擇一個符號....但是你想要返回所有的行嗎?從技術上講這可以在一個select語句來完成,像這樣

select from table where symbol=symbol 

但如果你的「工具」期待型符號的輸入,這可能無法正常工作。

要使用通配符,您需要「like」而不是equals,但聽起來好像無法控制它。

你認爲這個工具的設計只允許一個符號過濾器有一個原因?也許返回所有的行將會是太多的數據,也許它會太慢,也許它會佔用太多的內存。感覺就像你試圖破解一個快捷方式

+0

謝謝您的回答。我可以控制「喜歡」而不是平等。那麼通配符是什麼? – MarinD

+0

從t中選擇符號,如「?*」 – terrylynch

+0

實際上,這不會返回空符號,這將會:從t中選擇符號,如enlist「*」 – terrylynch

1

你可以將有問題的列轉換爲字符串並使用like。

實現您的要求的一種方法是選擇所有syms(如果用戶沒有指定過濾器或選擇用戶定義的子集)。

q)show myTable:update stamps:dates+'times from ([]syms:`AAPL`GOOG`PRDC`LALA`LOLO;times:5?.z.T;dates:5?.z.D) 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q)filter1:{[allSyms;usrSyms] symList:$[all null usrSyms;allSyms;usrSyms]; select from myTable where syms in symList}[exec distinct syms from myTable;] 
/filter1 is a projection so you don't have to query the table for all syms each time 
q)filter1`GOOG`APPL 
syms times  dates  stamps 
---------------------------------------------------------- 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter1`GOOG`AAPL 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter1` 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q) 

我寧願實現類似的東西;

q)filter2:{[usrSyms] ?[myTable;$[all null usrSyms;();enlist(in;`syms;enlist usrSyms)];0b;()]} 
q)filter2` 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
PRDC 00:15:49.627 2016.05.21 2016.05.21D00:15:49.627000000 
LALA 01:30:32.099 2015.01.04 2015.01.04D01:30:32.099000000 
LOLO 00:31:19.910 2013.12.01 2013.12.01D00:31:19.910000000 
q)filter2`GOOG 
syms times  dates  stamps 
---------------------------------------------------------- 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)filter2`GOOG`AAPL 
syms times  dates  stamps 
---------------------------------------------------------- 
AAPL 00:48:15.333 2003.04.10 2003.04.10D00:48:15.333000000 
GOOG 00:39:29.270 2015.06.14 2015.06.14D00:39:29.270000000 
q)