KDB + Как проверить, чтобы все столбцы имели одинаковый знак? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть таблица со следующими столбцами: дата, имя, 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 голосов
/ 31 мая 2018

В этом случае мы можем использовать data dateCols для вызова списка столбцов в запросе,

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

Однако я не думаю, что этот запрос будет генерировать желаемые результаты, альтернативой будет

update validateSign:1=(count distinct@)each flip signum data dateCols from data
0 голосов
/ 31 мая 2018

Комментарий Джорджа о первоначальном решении, дающем неверные результаты, является правильным, поскольку {x=/} не говорит о том, что все элементы в списке равны, это скользящий логический параметр, который проверяет, соответствует ли следующий элемент нулю или единице.Нечто подобное {all x[0]=x} достигнет того, что вы хотели.

К точке Джеммаса, если имена ваших столбцов могут отличаться, и вы хотите использовать конструкцию выбора, тогда вам придется использовать функциональный выбор формы:

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
0 голосов
/ 31 мая 2018

Для оператора обновления, содержащего имена переменных столбцов, вам необходимо использовать функциональное обновление.Приведенные ниже ссылки содержат дополнительную информацию:

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

Обычно самый простой способ вывести аргументы вашего функционального обновления - это использовать функцию parse впример, как вы предоставили.

...