добавить столбец в таблицу в kdb на основе существующих столбцов? - PullRequest
0 голосов
/ 24 января 2019

Я хочу добавить новый столбец в таблицу 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 ]

0 голосов
/ 24 января 2019

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

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
0 голосов
/ 24 января 2019

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

  q)update d:b|c from t

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

0 голосов
/ 24 января 2019

Заполнить можно здесь - 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
...
0 голосов
/ 24 января 2019

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

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

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

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

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

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

...