3

私はこれと混同しています: 以下を見てください。(1) と (2) の結果が異なるのはなぜですか? ご協力いただきありがとうございます。

    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
4

1 に答える 1

3

最初のものは変数symを関数に渡しますextr。この変数はtable の列ではありませんtrade。これは別個の (グローバル) 変数です。

この変数の値symはおそらく

`AMD`MSFT

だから表現は

(`$1#'string c) within r

ブール配列を生成します

01

あなたの希望ではなく

 01010101

つまり、ステートメントのwhere一部selectが値を持つインデックスの配列を生成することを意味します

 1

それ以外の

 1 3 5 7

そのため、期待する 4 行ではなく、テーブルの 1 行が返されます。

于 2012-11-21T15:21:21.633 に答える