我有一个包含以下列的表: 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
发布于 2018-05-31 16:59:06
在这种情况下,我们可以使用data dateCols
来调用查询中的列列表,
update validateSign:{x=/}each flip signum data dateCols from data
但是,我认为此查询不会生成所需的结果,另一种方法是
update validateSign:1=(count distinct@)each flip signum data dateCols from data
发布于 2018-06-01 03:15:24
因为{x=/}
不会告诉你列表中的所有项都是相等的,它是一个滚动布尔值,用于检查下一项是否匹配0或1。像{all x[0]=x}
这样的东西会达到你想要的效果。
Jemma指出,如果您的列名可以改变,并且您想要使用select构造,那么您将不得不使用以下形式的函数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
https://stackoverflow.com/questions/50618168
复制相似问题