Kdb upsert是否使用条件语法?

Kdb upsert是否使用条件语法?,kdb,Kdb,有没有一种方法可以在发生以下情况时在kdb中向上插入: 如果键不存在,请插入值 如果键存在,检查当前值是否大于 A) 如果是,则不执行任何操作 B) 如果没有,则更新值 比如: job upsert ([title: job1] time: enlist 1 where time > 1) 请在下面找到解决方案和解释。如果我能想出更好的办法,我会修改的——谢谢*我也希望我正确地解释了这个问题 q)t1 name | age height -------| ---------- mic

有没有一种方法可以在发生以下情况时在kdb中向上插入:

  • 如果键不存在,请插入值
  • 如果键存在,检查当前值是否大于
    A) 如果是,则不执行任何操作
    B) 如果没有,则更新值
  • 比如:

    job upsert ([title: job1] time: enlist 1 where time > 1)
    

    请在下面找到解决方案和解释。如果我能想出更好的办法,我会修改的——谢谢*我也希望我正确地解释了这个问题

    q)t1
    name   | age height
    -------| ----------
    michael| 26  173
    john   | 57  156
    sam    | 23  134
    jimmy  | 83  183
    conor  | 32  145
    jim    | 64  167
    q)t2
    name age height
    ---------------
    john 98  220
    mary 24  230
    jim  50  240
    q)t1 upsert t2 where{$[all null n:x[y`name];1b;y[`age]>n[`age]]}[t1;]each t2
    name   | age height
    -------| ----------
    michael| 26  173
    john   | 98  220
    sam    | 23  134
    jimmy  | 83  183
    conor  | 32  145
    jim    | 64  167
    mary   | 24  230
    q)
    
    解释;
    该函数使用2个参数,
    x
    =键控表
    t1
    y
    =来自
    t2
    的每条记录(作为字典)。首先,我们从
    t2
    记录(
    y`name
    )中提取
    name
    值,并尝试使用该值索引到源键控表中,并将结果存储在局部变量
    n
    中。如果名称存在,则相应的记录(
    n
    ,作为字典)将从
    y
    返回(并且
    all null n
    将为false),否则将返回空记录(并且
    all null n
    将为true)。如果在t1中找不到
    t2[`name]
    的实例,那么我们只需从函数返回
    1b
    。否则,我们要比较两个记录之间的年龄(
    n[`age]
    ),因为您使用的是键控表,并且您只想在值更大时更改值,并添加新的键和值,所以您可以尝试完全避免插入:

    t:([job:`a`b`c] val: 4 4 4)    /current table
    nt:([job:`a`c`d]val: 6 1 5)    /new values to check
    
    t|nt
    job| val
    ---| ---
    a  | 6
    b  | 4
    c  | 4
    d  | 5
    

    这将自动添加不存在的键,如果新值较大,则将当前值更新为新值。

    对于表、键和值:如果键是新的或值超过现有值,则向上插入元组

    q)t:([job:`a`b`c] val: 4 4 4)    /current table
    q)t[`a]|:6                       /old key, higher value
    q)t
    job| val
    ---| ---
    a  | 6
    b  | 4
    c  | 4
    q)t[`c]|:1                       /old key, lower value
    q)t
    job| val
    ---| ---
    a  | 6
    b  | 4
    c  | 4
    q)t[`d]|:5                       /new key
    q)t
    job| val
    ---| ---
    a  | 6
    b  | 4
    c  | 4
    d  | 5
    
    备注

    具有单个数据列的键控表可能是字典

    也可以使用新密钥

    更新新记录的表(或字典)比更新单个元组更高效、更简单

    q)nt:([job:`a`c`d]val: 6 1 5)    /new values to check
    q)t|nt                           /maximum of two tables
    job| val
    ---| ---
    a  | 6
    b  | 4
    c  | 4
    d  | 5
    
    或者只是

    q)t[([]job:`a`c`d)]|:([]val:6 1 5)
    

    简单的原语,如RETURN仔细研究。

    此答案第一句的前提是错误的。OP希望插入新的键。这似乎是@Ryan McCarron先前答案的一个非常接近的副本。这是一个比我更透彻的解释-OP可能会从阅读这篇文章中学到更多您表格的示例。我的t1键入了名称,而t2是一个未指定的表。我的
    t2
    已键入。