Kdb upsert与条件语法?

时间:2017-11-22 01:14:18

标签: kdb

有没有办法可以在kdb中进行升级,发生以下情况:

  1. 如果密钥不存在,请插入值
  2. 如果存在密钥,请检查当前值是否更大 A)如果是,则不执行任何操作
    B)如果没有,请更新值
  3. 类似的东西:

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

3 个答案:

答案 0 :(得分:3)

由于您使用的是键控表,并且只想更改值并添加新的键和值,您可以尝试避免完全插入:

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

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

答案 1 :(得分:2)

请在下面找到解决方案和解释。如果我想出一个更好的方法,我会编辑 - 谢谢。 *我希望我能正确解释这个问题。

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 =键控表t1y =来自t2的每个记录(作为字典)。首先,我们从name记录(t2)中提取y`name值,并尝试使用该值索引到源键控表,并将结果存储在局部变量n中。如果名称存在,则相应的记录(n,作为字典)将从y返回(并且all null n将为false)否则将返回空记录(并且{{ 1}}将是真的)。如果我们在t1中找不到all null n的实例,那么我们只需从函数返回t2[`name]。否则,我们希望比较两个记录之间的年龄(1b< - n[`age]中引用的年龄,以匹配名称& t1< - 此特定年龄记录y[`age]) - 如果t2t2)中此匹配记录的年龄大于y[`age]的匹配值,则返回t1否则我们返回1b

此功能的结果是一个布尔列表,一个用于0b中的每个记录。 1b在两种情况下返回 - 或者; (1)t2中的此特定名称在t2中不匹配。 (2)t1中的此名称在t2中匹配且年龄大于t1中的相应年龄。当t1中引用的年龄小于t2的相应年龄时,将返回0b。

在我们的示例中,函数的结果是t1,在我们将110b应用于此之后,结果是列表值为true的索引,即where - > where 110b。我们使用此列表索引0 1,它返回t2的前2个记录(这些记录或记录的年龄大于t2中引用的记录),然后我们只需将其插入t1

我希望这有所帮助,并希望有更好的解决方案出现。

答案 2 :(得分:2)

对于表,键和值:如果键是新的或值超过现有值,则将元组置位。

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

<强>说明

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

Amending through an operator也可以使用新密钥。

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

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)

maximum (|)这样简单易懂的原语可以用来仔细研究。