Добавить столбец в таблицу в KDB на основе существующих столбцов?

Я хочу добавить новый столбец в таблицу KDB, он должен добавить на основе существующего столбца, заполнив ненулевое значение, как показано ниже

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)t
a b c
-----
a 1  
b   2
c 3  
d 4  
e   5
f 6  
g   7
h 8  

Я хочу добавить столбец d, который будет принимать значение из c или d, которое не является нулевым, для создания таблицы, подобной этой

a b c d
-------
a 1   1
b   2 2
c 3   3
d 4   4
e   5 5
f 6   6
g   7 7
h 8   8

Я попытался объединить, но тогда в нем есть нуль:

q)update d:(b,'c)from t
a b c  d  
----------
a 1    1  
b   2    2
c 3    3  
d 4    4  
e   5    5
f 6    6  
g   7    7
h 8    8  

4 ответа

Условный вектор может быть тем, что вы ищете, что-то вроде ниже:

update d:?[null b;c;b] from t

Вы можете прочитать больше о векторных условных выражениях здесь. Это ожидает логический список в качестве первого аргумента и возвращает значения из списка во втором аргументе, где True, или значения из списка в третьем аргументе, где False. Например:

q)?[10101b;”abcde”;”ABCDE”]
“aBcDe”

При использовании в сочетании с оператором выбора / обновления столбцы таблицы могут быть указаны в качестве аргументов условного вектора, поскольку это просто списки.

Помимо этого, null Ключевое слово возвращает логическое значение true, где значение равно нулю и полезно как часть вашего решения.

Вы можете использовать ^ (заполнить) оператор.

t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:b^c from t
a b c d
-------
a 1   1
b   2 2
c 3   3
d 4   4
e   5 5
f 6   6
g   7 7
h 8   8

Стоит отметить, что если у вас была строка с ненулевыми значениями для b а также c тогда запрос выше будет по умолчанию к значению в c, Если вы предпочитаете значение в b по умолчанию, затем переключите входы:

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 100 7 0n)
q)update d:b^c from t
a b c   d
-----------
a 1     1
b   2   2
c 3     3
d 4     4
e   5   5
f 6 100 100
g   7   7
h 8     8
q)update d:c^b from t
a b c   d
---------
a 1     1
b   2   2
c 3     3
d 4     4
e   5   5
f 6 100 6
g   7   7
h 8     8

Можете заполнить здесь - https://code.kx.com/wiki/Reference/Caret

q)t:([]a:`a`b`c`d`e`f`g`h;b:1 0n 3 4 0n 6 0n 8;c:0n 2 0n 0n 5 0n 7 0n)
q)update d:c^b from t
a b c d
-------
a 1   1
b   2 2
c 3   3
...

Вы можете использовать оператор "или (|)".

  q)update d:b|c from t

Concat выдаст вам список элементов из столбцов "b" и "c". Это не удалит ноль. 'or' сравнивает каждую пару 'b' и 'c' и возвращает максимальное значение из этой пары. Так как ноль меньше целого числа, он даст вам целочисленное значение из столбца "b" или "c".

Другие вопросы по тегам