【发布时间】:2021-03-12 18:05:16
【问题描述】:
我有一个表tab,其中包含列date,sym,value,并且从最早的日期到最近的日期排序。
我正在尝试为每个 sym 选择过去的 N 记录,但不确定对此的查询。我知道我可以根据date 在某个范围内进行选择,但我需要根据sym 进行选择,无论value 是否出现在连续日期。
【问题讨论】:
标签: kdb
我有一个表tab,其中包含列date,sym,value,并且从最早的日期到最近的日期排序。
我正在尝试为每个 sym 选择过去的 N 记录,但不确定对此的查询。我知道我可以根据date 在某个范围内进行选择,但我需要根据sym 进行选择,无论value 是否出现在连续日期。
【问题讨论】:
标签: kdb
您可以使用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]]
【讨论】:
如果您希望返回表中的所有列,Matt 建议最好使用 fby 和功能选择。如果您只需要返回的date、sym 和price 列,您可以使用
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
请注意,选择大量列时,这可能会变得繁琐。在这些情况下,最好坚持马特的建议。
【讨论】: