2013-06-21 32 views
4

我想在接下來的5,10,30分鐘內選擇表中的最大元素。 我懷疑這對於where子句中的多個元素是不可能的。 使用正常的<</:都失敗了。我的代碼/查詢如下:如何在kdb中使用多個參數查詢哪裏?

`select max price from dat where time</: (09:05:00; 09:10:00; 09:30:00)` 

任何想法我在這裏做錯了什麼? 這個想法是在該行的下一個5,10,30 ...分鐘內獲得每行的最大價格,而不是整個表格中的3個最大價格。

select max price from dat where time</: time+\:(5 10 30) 

這不起作用,但應該給出一般的想法。

爲了進一步澄清,我想從表中每行的時間[i]計算5,10,30分鐘間隔的最大價格。因此,對於x + 5,x + 10,x + 30分鐘內的每個表格行最大價格,其中x是該行中的時間條目。

回答

0

這工作,但需要大量的時間。對於20K記錄,〜20秒,太多了!任何方式,使其更快

dat: update tmlst: time+\:mtf*60 from dat; 
dat[`pxs]: {[x;y] {[x; ts] raze flip raze {[x;y] select min price from x where time<y}[x] each ts }[x; y`tmlst]} [dat] each dat; 
0

你可以嘗試這樣的事:

select c1:max price[where time <09:05:00],c2:max price[where time <09:10:00],c3:max price from dat where time< 09:30:00 

可以,只要你喜歡paramatize此查詢。所以如果你有一個時間列表,那麼l:09:05:00 09:10:00 09:15:00 09:20:00 ...你可以使用上面查詢的一個函數形式創建一個函數來工作升不同的長度,這樣的:

q)f:{[t]?[dat;enlist (<;`time;max t);0b;(`$"c",/:string til count t)!flip (max;flip (`price;flip (where;((<),/:`time,/:t))))]} 
q)f l 

可以擴展F到採取不同的功能,而不是最大,工作不同的表等

+0

這正是我想要避免的。如果我不得不爲5,10,20,25,30,35 ....等等,這種解決方案是不理想 –

+0

編輯。同樣的解決方案,但paramaterized。 – user1895961

+0

f的用法是什麼?嘗試f [(15 30 60 120)],它只是在單獨的列中給出4個值,而不是我正在尋找的。 –

0

此構建了一步字典時代映射到你的水桶:

q)-1_select max price by(`s#{((neg w),x)!x,w:(type x)$0W}09:05:00 09:10:00 09:30:00)time from dat 

您可能還能夠 AB 使用wj

q)wj[{(prev x;x)}09:05:00 09:10:00 09:30:00;`time;([]time:09:05:00 09:10:00 09:30:00);(delete sym from dat;(max;`price))] 

如果您的所有存儲桶尺寸相同,則更容易:

q)select max price by 300 xbar time from dat where time<09:30:00/300-second (5-min) buckets 
+0

同樣,答案只會返回到0930年的恆定桶。我想爲表中的所有行執行此操作。對於每次x,我想計算x + 5,x + 15,x + 30 ...分鐘後的最大價格。 –