Kdb 如何高效地查询第一行?

Kdb 如何高效地查询第一行?,kdb,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 它需要很长的时间来执行,因为

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

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

在KDB中,select语句中的子语句按顺序执行。i、 e.只有通过第一次测试的记录才能通过第二次测试。记住这一点,看看你的两次尝试:

select from prices where date = 2019.03.07, instrument = `X, i = 0        //It does not return any record (why?)
这不一定返回任何内容,因为当它进入i=0检查时,您已经过滤掉了一些记录,可能包括原始表中的第一条记录,该记录的i=0


这个应该有用。首先按日期过滤。然后,在该日期的记录中,选择仪器'X的记录。然后在这些记录中,选择记录,其中i是已被过滤的第一个i,因此第一个i只是第一个记录的索引[仍然是原始表中的索引,而不是过滤后的版本]

Q-SQL等价于此,在大多数情况下,它的性能也优于其他方法。正“n”将给出前n条记录,负“n”将给出最后n条记录

q) select[1] from prices where date = 2019.03.07, instrument = `X

第一次比赛后,没有内置的停止功能。您可以为此编写自定义函数,但其执行速度可能比上述支持的版本慢。

只有在您要查找的仪器是表中的第一项时,使用i=0才有效。当i=first i时,查询将使用筛选选择中的第一个索引。您是否已向仪器列添加或考虑添加属性?例如,如果您要应用'p'属性,它应该使select语句中的第二个子句instrument=X快得多。此外,如果您的目的是获取所有工具的开盘价,您可能希望尝试从日期=2019.03.07,i=first的价格中进行选择;ifby instrument。我只是用\t做了一个简单的测量。1子列表和i=first i的版本需要相同的时间才能完成。如何在Oracle中实现rownum=1这样的功能?操作员可以找到仪器第一个实例的索引,然后将其与I列匹配。类似于:从价格中选择,其中日期=2019.03.07,i=仪器`X@JorgeSawyer这是个好办法!你想让它成为一个答案吗?@texasbruce如果你看Rahul答案的评论,你会发现Jorge提出的这个解决方案实际上并不奏效。不幸的是,find操作符只找到向量的第一个匹配项,因此我们可以使用它来获得这个功能:从价格中选择日期=2019.03.07,i=仪器?`X这不起作用,会给出一个不可预测的答案。原因是在第一个筛选器之后,i'可能不会从0开始,但第二个筛选器中的find将生成一个以0为基础的索引。第二个filterfind无法跟踪第一个filter生成的索引。我们可以将其修复为:从价格中选择,其中日期=2019.03.08,i=i仪器?`X。但是,由于查找操作符不考虑排序属性之类的属性,所以它与其他内置搜索相比,在具有适当属性的大表上运行速度较慢。在普通表上,它可以运行得更快。我原以为I列在任何给定分区内都会从零开始。是否存在我的假设失败的特定场景,或者i列的行为通常是不可预测的?对于分区,我从0开始是正确的。对于分区数据库,它可以正常工作,但对于内存表,则不行。另外,在分区数据库的情况下,如果在date和instrument筛选器之间添加了一个额外的筛选器,那么它将再次成为相同的情况,即我不会从0开始,而是依赖于最后一个筛选器。
q) select[1] from prices where date = 2019.03.07, instrument = `X