有没有办法可以在kdb中进行升级,发生以下情况:
类似的东西:
job upsert ([title: job1] time: enlist 1 where time > 1)
答案 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
=键控表t1
和y
=来自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]
) - 如果t2
(t2
)中此匹配记录的年龄大于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 (|
)这样简单易懂的原语可以用来仔细研究。