【问题标题】:How to create a cursor in kdb?如何在 kdb 中创建游标?
【发布时间】:2013-05-28 23:36:34
【问题描述】:

我想遍历时间序列、分区 kdb 数据库中的所有行,并在每一步执行一些计算。在 SQL 中,这可以通过游标来完成。 kdb有类似的吗?

一些背景:数据库包含数百万个时间序列记录,当我在行中进行时,我需要维护许多对象的状态。我需要在每一步运行一些“if”语句。我想将我的计算集成到查询中,但由于我必须执行的测试数量,我认为游标或类似行回调的东西会更合适。在“重放”数据库的同时运行自定义代码的最有效解决方案是什么?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    q 中的表的行为很像字典列表。因此,如果 t 是一个表,则 t[0] 将是一个字典,将列名映射到第一行值,t[1] 将是第二行,依此类推。所以实际上你的光标只是一个索引,而光标的前进只是增加索引。

    q)t:([]c1:1 2 3;c2:`a`b`c);
    q)show t[0];
    c1| 1
    c2| `a
    q)show t[1];
    c1| 2
    c2| `b
    

    另一方面,将操作应用于列表元素的更惯用方式可能是使用 each 运算符:

    q)f:{show x};
    q)f each t;
    c1| 1
    c2| `a
    c1| 2
    c2| `b
    c1| 3
    c2| `c
    

    【讨论】:

    • 对于分区表,我必须在索引之前创建一个处理程序:t: select from myPartTable where data=2013.05.23。我相信分配t时数据不会加载到内存中,只有在通过索引访问时才加载,对吧?
    • 是的。如果要将数据加载到内存中,请添加另一个 where 子句i>-1。来自code.kx.com 的文档 - 展开的表沿其列垂直拆分,随后映射到内存中。对映射表执行查询时,根据需要加载列数据并由操作系统缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多