https://code.kx.com/q/wp/capi/#publishing-to-a-kdb-tickerplant

方案:

trade:([]
  time:`timespan$();
  sym:`symbol$();
  price:`float$();
  size:`long$()`
  )

示例tickerplant发布者代码:

    K singleRow= knk(3, ks((S) "ABC"), kf(10.0), kj(20));
    // Perform single row upsert, tickerplant will add timestamp column itself
    result= k(handle, ".u.upd", ks((S) "trade"), singleRow, (K)0); 

现在,让我们假设这个表是按sym列设置键的.现在,当我执行这个函数时,它调用upsert,但我需要的是在upsert功能之上(如果键不存在则插入,如果键存在则更新),我还需要的是在upsert过程中只指定某些列,这意味着在upsert过程中,如果键存在,它只更新指定的列,而其他列保持不变.我可以在C代码中修改它吗?

例如,伪代码:

    K singleRow= knk(3, ks((S) "ABC"), kj(20));
    // Perform single row upsert, tickerplant will add timestamp column itself
    result= k(handle, ".u.upd", ks((S) "trade"), singleRow, (K)0); 

正如您所看到的,我只指定了SIZE列值,所以我希望做的是,如果键存在(在本例中是ABC),那么它只更新SIZE列,因为我没有指定PRICE列,所以它应该与之前的值相同.

推荐答案

您正在向kdb+tickerants发送一个列表,但是如果您不全部发送这些值,tickerants就无法知道这些值引用的是哪一列.例如,is

(`ABC;2024.01.06D13:19:40.151165000;20)

sym,time,price还是sym,time,size?当然,您可以输入check(在您的示例中,Float表示价格,Long表示大小--但您可能还需要处理分数份额,这意味着Size也是Float).

在我看来,最好的 Select 是始终发送来自feed处理程序的所有字段,缺省所有缺少的条目,这样您总是发送一个列表,每个列都有一个条目.您还应该知道,如果您在tickerants中键入您的表,并且您启用了批处理-批处理内更新可能会覆盖以前的更新.

如果无论出于什么原因都无法做到这一点,您的下一个最佳 Select 是修改.U.S.upd函数,以接受您要发送的表名、数据和列名列表.然后,您可以在.U.S.upd函数-upsert中组合列名和数据,然后处理您想要的功能.例如:

q)// sending all values
q)trade upsert`sym xkey enlist`sym`time`price`size!(`ABC;.z.p;10.0;20)
sym| time                          price size
---| ----------------------------------------
ABC| 2024.01.06D13:27:43.368951000 10    20
q)// sending a subset of values
q)trade upsert`sym xkey enlist`sym`size!(`ABC;20)
sym| time price size
---| ---------------
ABC|            20

如果在某些值丢失时需要延续以前的值,则可以在RDB中使用fills:(为此,您的表需要取消键值):

q)trade:trade upsert enlist`sym`time`price`size!(`ABC;.z.p;10.0;20)
q)trade:trade upsert enlist`sym`time`size!(`ABC;.z.p;20)
q)trade
sym time                          price size
--------------------------------------------
ABC 2024.01.06D13:31:34.836794000 10    20
ABC 2024.01.06D13:31:48.141010000       20
q)fills trade
sym time                          price size
--------------------------------------------
ABC 2024.01.06D13:31:34.836794000 10    20
ABC 2024.01.06D13:31:48.141010000 10    20

C++相关问答推荐

带双指针的2D数组

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

设计处理各种数据类型的方法和数据 struct

从STdin读写超过4096个字节

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

编译SDL 2时缺少SDL_ttf

为什么可以通过指向常量int的指针间接地改变整数的值?

核心转储文件中出现奇怪的大小变化

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

进程在写入管道时挂起

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

Caesar密码调试:输出文本末尾的问号和随机字符

C语言中奇怪的输出打印数组

将非连续物理内存映射到用户空间

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

C23标准是否向后兼容?

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

我错误地修复了一个错误,想了解原因

将char*铸造为空**

文件指针引起的C程序分段错误