KDB +如何检查所有列是否具有相同的符号?

时间:2018-05-31 06:41:10

标签: dataframe match kdb

我有一个包含以下列的表:date,name,cashType,t1,t2,t3。我想添加一个列,如果t1,t2和t3列相等,则返回一个布尔值。

这有效但我必须硬编码t1,t2和t3。列名称根据日期而变化。我想将列dateCols:-3#cols data列表传递到下面的代码中。

update validateSign: {x=/} each flip signum (d2018_05_28; d2018_05_29; d2018_05_30) from data

3 个答案:

答案 0 :(得分:4)

对于包含变量列名的更新语句,您需要使用功能更新。以下链接包含更多信息:

https://code.kx.com/q/ref/funsql/ http://code.kx.com/wiki/JB:QforMortals/queries_q_sql#Functional_Forms_of_select_and_update

通常,推断功能更新参数的最简单方法是在您提供的示例中使用&tr函数。

答案 1 :(得分:4)

在这种情况下,我们可以使用data dateCols来调用查询中的列列表

update validateSign:{x=/}each flip signum data dateCols from data

但是,我不认为这个查询会产生预期的结果,另一种选择是

update validateSign:1=(count distinct@)each flip signum data dateCols from data

答案 2 :(得分:1)

Georges对原始解决方案给出错误结果的评论是正确的,因为{x=/}没有告诉您列表中的所有项目都相同,它是一个滚动布尔值,用于检查下一个项目是否与零或一个匹配。像{all x[0]=x}这样的东西可以实现你想要的。

对于Jemmas来说,如果您的列名可能有所不同,并且您想要使用select构造,那么您将不得不使用该形式的功能选择:

q)data:([] date:10#.z.D;name:10?`4;cashType:10?`A`B;t1:-5+10?10;t2:-5+10?10;t3:-5+10?10)
q)dateCols:-3#cols data
q)![data;();0b;(1#`validateSign)!enlist ({all flip x[;0]=x};(flip signum@;enlist,dateCols))]
date       name cashType t1 t2 t3 validateSign
----------------------------------------------
2018.05.31 hjkn B        -1 4  0  0
2018.05.31 okdm A        2  0  3  0
2018.05.31 jggp A        3  -3 0  0
2018.05.31 oimo A        -1 -2 -3 1
2018.05.31 naea A        -1 4  3  0
2018.05.31 jadb B        1  0  1  0
2018.05.31 nojg A        4  4  4  1
2018.05.31 keno B        4  2  -5 0
2018.05.31 hdai B        -3 1  -5 0
2018.05.31 mfmf A        0  1  -5 0