【问题标题】:query for selecting N records查询选择 N 条记录
【发布时间】:2021-03-12 18:05:16
【问题描述】:

我有一个表tab,其中包含列date,sym,value,并且从最早的日期到最近的日期排序。

我正在尝试为每个 sym 选择过去的 N 记录,但不确定对此的查询。我知道我可以根据date 在某个范围内进行选择,但我需要根据sym 进行选择,无论value 是否出现在连续日期。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您可以使用fby 和虚拟行号列i 来做到这一点:

    https://code.kx.com/q/ref/fby/

    q){ select from tab where ({y in x#y}[x];i) fby sym }[-2]
    
    date       sym  time                          src price size
    ------------------------------------------------------------
    2014.04.21 AAPL 2014.04.21D16:29:03.253000000 N   24.98 3561
    2014.04.21 AAPL 2014.04.21D16:29:03.558000000 N   24.98 2733
    2014.04.21 CSCO 2014.04.21D16:28:56.265000000 O   35.6  8390
    2014.04.21 CSCO 2014.04.21D16:29:44.572000000 L   35.61 2286
    2014.04.21 DELL 2014.04.21D16:29:35.374000000 L   29.57 1444
    2014.04.21 DELL 2014.04.21D16:29:39.979000000 N   29.56 216
    2014.04.21 GOOG 2014.04.21D16:29:50.569000000 N   41.87 722
    2014.04.21 GOOG 2014.04.21D16:29:58.633000000 O   41.9  437
    

    编辑:更快的方法是使用函数式 exec 和每个 sym 的第 5 个参数 n(记录数)。

    raze{
    
        //[table;where;by;cols;rows]
        ?[tab;enlist (in;`sym;enlist x);0b;();y]
    
    }[;-2]'[distinct tab[`sym]]
    

    https://code.kx.com/q/basics/funsql/

    【讨论】:

      【解决方案2】:

      如果您希望返回表中的所有列,Matt 建议最好使用 fby 和功能选择。如果您只需要返回的datesymprice 列,您可以使用

      q)ungroup select -2#date,-2#price by sym from trade
      sym  date       price
      ----------------------
      APPL 2021.03.13 111.77
      APPL 2021.03.13 111.85
      CAT  2021.03.13 246
      CAT  2021.03.13 246.27
      GOOG 2021.03.13 206.24
      GOOG 2021.03.13 206.21
      NYSE 2021.03.13 60.67
      NYSE 2021.03.13 60.97
      

      请注意,选择大量列时,这可能会变得繁琐。在这些情况下,最好坚持马特的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-15
        • 2020-06-21
        • 1970-01-01
        • 2013-09-26
        • 2012-02-09
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多