问题描述
我有一个表 tab
,其列数为 date,sym,value
,按从最早到最近的顺序排列。
我正在尝试为每个 N
选择过去的 sym
记录,但不确定此查询。我知道我可以根据 date
在一个范围内进行选择,但我需要根据 sym
进行选择,无论 value
是否连续出现。
解决方法
您可以使用 const
getKeys = (object,string) => Object
.keys(object)
.filter(k => Object.values(object[k]).some(v => v.includes(string))),foo = { 65: { foo: 'bar',bar: 'amet',dolor: 'foo' },66: { foo: 'foo',bar: 'sit',dolor: 'amet' },70: { foo: 'amet',lorem: 'amet',bar: 'sit' } };
console.log(getKeys(foo,'o'));
和虚拟行号列 fby
执行此操作:
https://code.kx.com/q/ref/fby/
i
编辑:更快的方法是对每个符号使用带有第 5 个参数 n(记录数)的函数式 exec。
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
https://code.kx.com/q/basics/funsql/
,如果您希望返回表中的所有列,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
请注意,选择大量列时可能会变得繁琐。在这些情况下,最好坚持马特的建议。