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