我有一个包含大量记录的表:
date instrument price
2019.03.07 X 1.1
2019.03.07 X 1.0
2019.03.07 X 1.2
...
当我查询当日开盘价时,我使用:
1 sublist select from prices where date = 2019.03.07, instrument = `X
执行时间很长,因为它会选择当天的所有价格并获得第一个价格。
我也尝试过:
select from prices where date = 2019.03.07, instrument = `X, i = 0 //It does not return any record (why?)
select from prices where date = 2019.03.07, instrument = `X, i = first i //Seem to work. Does it?
在Oracle中,等效项为:
select * from prices where date = to_date(...) and instrument = "X" and rownum = 1
Oracle找到第一条记录后将立即停止。
如何在KDB中执行此操作(例如,在找到第一条记录后立即停止)?
答案 0 :(得分:3)
在kdb中,where
语句中的select
子句按顺序执行。也就是说,只有那些通过第一个“测试”的记录才传递给第二个测试。考虑到这一点,请看一下您的两次尝试:
select from prices where date = 2019.03.07, instrument = `X, i = 0 //It does not return any record (why?)
这不会(有必要)返回任何内容,因为到进行i=0
检查时,您已经过滤掉了一些记录(可能包括原始表中的第一条记录, i=0
)
select from prices where date = 2019.03.07, instrument = `X, i = first i //Seem to work. Does it?
这应该有效。首先,您按日期过滤。然后,在该日期的记录中,选择工具`X
的记录。然后在这些记录中的 中,获得i
是first i
的记录(其中i
已经被过滤掉了,所以first i
很简单第一条记录的索引[仍是原始表的索引,而不是过滤后的版本])
答案 1 :(得分:0)
Q-SQL等效的是select[n],在大多数情况下,它的性能也优于其他方法。正数“ n”将给出前n条记录,负数将给出后n条记录。
q) select[1] from prices where date = 2019.03.07, instrument = `X
没有内置功能可在第一个比赛后停止。您可以为此编写自定义函数,但执行起来可能会比支持的版本慢。
答案 2 :(得分:-5)
您可以使用MySQL查询的“限制”部分。基本上,它的作用是限制您放置在限制位置的数量,如果将限制设置为1,它将抢占第一个。I.E
select from prices where date = 2019.03.07, instrument = `X, limit 1