2012-10-06 162 views
3

我對此感到困惑:請看下面的內容。爲什麼線條(1)和(2)產生不同的結果?謝謝你的幫助。kdb函數不起作用

q)trade 
    date  open high low close volume sym 
    ------------------------------------------------ 
    2006.10.03 24.5 24.51 23.79 24.13 19087300 AMD 
    2006.10.03 27.37 27.48 27.21 27.37 39386200 MSFT 
    2006.10.03 24.1 25.1 23.95 25.03 17869600 AMD 
    2006.10.03 27.39 27.96 27.37 27.94 82191200 MSFT 
    2006.10.03 24.8 25.24 24.6 25.11 17304500 AMD 
    2006.10.03 27.92 28.11 27.78 27.92 81967200 MSFT 
    2006.10.03 24.66 24.8 23.96 24.01 17299800 AMD 
    2006.10.03 27.76 28 27.65 27.87 36452200 MSFT 
    q)extr 
    {[t;c;r] select from t where (`$1#'string c) within r} 
    q) 
    q) 
    q)extr[trade;sym;`K`Z]         /(1) 
    date  open high low close volume sym 
    ------------------------------------------------ 
    2006.10.03 27.37 27.48 27.21 27.37 39386200 MSFT 
    q) 
    q) 
    q)select from trade where (`$1#'string sym) within `K`Z  /(2) 
    date  open high low close volume sym 
    ------------------------------------------------ 
    2006.10.03 27.37 27.48 27.21 27.37 39386200 MSFT 
    2006.10.03 27.39 27.96 27.37 27.94 82191200 MSFT 
    2006.10.03 27.92 28.11 27.78 27.92 81967200 MSFT 
    2006.10.03 27.76 28 27.65 27.87 36452200 MSFT 

回答

3

第一個經過一個可變sym給函數extr。該變量是而不是來自表trade的列;它是一個單獨的(全局)變量。

此變量sym的值是可能只是

`AMD`MSFT 

所以表達式

(`$1#'string c) within r 

產生布爾陣列

01 

而比所需

01010101 

這反過來又意味着你select聲明where部分產生索引數組具有價值

1 

,而不是

1 3 5 7 

使返回你的表中的一行,而不是你期望的四行。