我有一个包含以下列的表: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
答案 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