Symbols 表中定义为符号列表的更新字段

Symbols 表中定义为符号列表的更新字段,symbols,kdb,Symbols,Kdb,我有下表: q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$()))) q)t col vals --------------- a `abc`def b ,`abc c `symbol$() 我想更新col=c的条目,即符号的空列表,但在尝试以下查询时,我得到了一个“长度”错误: update vals:(enlist `unknown) from t where 0=count each

我有下表:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))

q)t
col vals       
---------------
a   `abc`def   
b   ,`abc      
c   `symbol$()
我想更新col=c的条目,即符号的空列表,但在尝试以下查询时,我得到了一个“长度”错误:

update vals:(enlist `unknown) from t where 0=count each vals

然后,我们的目标是对t进行解组,不要丢失VAL=`symbol$处的数据,因为当前解组会使我丢失一些行。

要将VAL列中的空符号列表替换为`unknown',您可以使用以下方法:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))
q)t:6#t
update vals:{$[x~`symbol$();enlist `unknown;x]}'[vals] from t
输出:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown
它使用您在val中查找计数为0的值的方法

或者,您也可以使用以下内容:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))
q)t:6#t
update vals:{$[x~`symbol$();enlist `unknown;x]}'[vals] from t
与第一个示例相同的输出:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown

此方法仅检查val值是否为空,并相应地将其val值替换为“未知”。

要将val列中的空符号列表替换为“未知”,可以使用以下方法:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))
q)t:6#t
update vals:{$[x~`symbol$();enlist `unknown;x]}'[vals] from t
输出:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown
它使用您在val中查找计数为0的值的方法

或者,您也可以使用以下内容:

q)t:([]col:`a`b`c; vals:((`abc`def);(enlist `abc);(`$())))
q)t:6#t
update vals:{$[x~`symbol$();enlist `unknown;x]}'[vals] from t
与第一个示例相同的输出:

col vals
-------------
a   `abc`def
b   ,`abc
c   ,`unknown
a   `abc`def
b   ,`abc
c   ,`unknown
这种方法只是检查val的值是否为空,并相应地将其值替换为“未知”。

我猜您在更新其他表时遇到了“长度错误”,而不是您作为示例给出的表。您的示例代码运行良好。它在只有一行(其中0=计算每个VAL)的t上工作,但在有多行满足where条件的表上失败的原因是更新需要更新列表的大小来匹配目标。如果表中有多行VAL为空,则更新将失败,因为您提供的列表中只包含一个新值

顺便说一下,如果一列是一个向量,即一个简单的原子列表,那么提供一个原子作为更新将起作用,因为原子被扩展以匹配向量。但向量没有

解决这一问题的一种方法是按照Rob的建议提供一份符合要求的清单,或者,作为替代方案,使用:

我猜您在更新其他一些表时遇到了“长度错误”,而不是您给出的示例。您的示例代码运行良好。它在只有一行(其中0=计算每个VAL)的t上工作,但在有多行满足where条件的表上失败的原因是更新需要更新列表的大小来匹配目标。如果表中有多行VAL为空,则更新将失败,因为您提供的列表中只包含一个新值

顺便说一下,如果一列是一个向量,即一个简单的原子列表,那么提供一个原子作为更新将起作用,因为原子被扩展以匹配向量。但向量没有

解决这一问题的一种方法是按照Rob的建议提供一份符合要求的清单,或者,作为替代方案,使用:


你也可以考虑自己的非群函数,如果这最终是你要解决的问题:

q)raze{$[count f:flip x;f;enlist first each x]}'[t]
col vals
--------
a   abc
a   def
b   abc
c

你也可以考虑自己的非群函数,如果这最终是你要解决的问题:

q)raze{$[count f:flip x;f;enlist first each x]}'[t]
col vals
--------
a   abc
a   def
b   abc
c