如何有效查询第一行?

时间:2019-03-07 19:20:32

标签: kdb

我有一个包含大量记录的表:

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中执行此操作(例如,在找到第一条记录后立即停止)?

3 个答案:

答案 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的记录。然后在这些记录中的 中,获得ifirst 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