我使用KDB和一個讓我設置查詢的工具。使用此工具,只有參數(過濾器值)可以隨用戶交互而改變,而不是查詢的結構。 我需要一個查詢在用戶操作上運行。默認情況下,我希望它選擇每一行,並且在他選擇了某些內容之後,我希望查詢按他的選擇進行過濾。從通配符中選擇,在Q KDB
例如: 默認: 從報價其中符號= *
用戶之後選擇一個符號選擇: 從報價其中符號=`AAPL
但是,默認實例沒有按」選擇因爲在KDB中沒有*通配符,與SQL不同。我怎樣才能默認獲得所有行呢?
我使用KDB和一個讓我設置查詢的工具。使用此工具,只有參數(過濾器值)可以隨用戶交互而改變,而不是查詢的結構。 我需要一個查詢在用戶操作上運行。默認情況下,我希望它選擇每一行,並且在他選擇了某些內容之後,我希望查詢按他的選擇進行過濾。從通配符中選擇,在Q KDB
例如: 默認: 從報價其中符號= *
用戶之後選擇一個符號選擇: 從報價其中符號=`AAPL
但是,默認實例沒有按」選擇因爲在KDB中沒有*通配符,與SQL不同。我怎樣才能默認獲得所有行呢?
不確定你想要達到什麼,或者你的確切約束是什麼。
如果你說等於(=)是固定的,那麼你只能選擇一個符號....但是你想要返回所有的行嗎?從技術上講這可以在一個select語句來完成,像這樣
select from table where symbol=symbol
但如果你的「工具」期待型符號的輸入,這可能無法正常工作。
要使用通配符,您需要「like」而不是equals,但聽起來好像無法控制它。
你認爲這個工具的設計只允許一個符號過濾器有一個原因?也許返回所有的行將會是太多的數據,也許它會太慢,也許它會佔用太多的內存。感覺就像你試圖破解一個快捷方式
你可以將有問題的列轉換爲字符串並使用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)
謝謝您的回答。我可以控制「喜歡」而不是平等。那麼通配符是什麼? – MarinD
從t中選擇符號,如「?*」 – terrylynch
實際上,這不會返回空符號,這將會:從t中選擇符號,如enlist「*」 – terrylynch