Как удалить несколько столбцов из таблицы?

Итак, есть delete col from table для удаления одного столбца. Я полагаю, что мог бы использовать over для удаления нескольких столбцов. Но:

  • Я не уверен, что это вообще эффективно.

  • Я не совсем уверен, как правильно использовать over здесь. Что-то вроде этого не работает: {delete y from x}/[t;`name`job]


person rgrinberg    schedule 15.10.2017    source источник


Ответы (3)


вы можете удалить несколько столбцов так же, как вы можете выбрать несколько столбцов.

delete col1,col2 from table

Определенно было бы менее эффективно использовать over в этом случае.

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

Для этого необходимо использовать функциональную форму удаления: https://code.kx.com/q/ref/funsql/

Пример функционального удаления

q)table:([]col1:1 2 3;col2:1 2 3;col3:10 20 30) 
q)//functional delete
q){![table;();0b;x]} `col1`col2
col3
----
10  
20  
30  
q)//inplace functional delete
q){![`table;();0b;x]} `col1`col2
`table
q)table
col3
----
10  
20  
30 
person emc211    schedule 15.10.2017
comment
Спасибо, функциональная форма именно то, что мне было нужно. - person rgrinberg; 15.10.2017
comment
Хм, функциональное удаление не работает, когда список столбцов пуст. Я ожидаю, что это вообще не коснется таблицы, но вместо этого удалит все строки в ней. - person rgrinberg; 15.10.2017

Для таблицы в памяти вы также можете использовать drop: http://code.kx.com/q/ref/lists/#_-drop

q)((),`col1)_table
col2 col3
---------
1    10
2    20
3    30
q)((),`col1`col3)_table
col2
----
1
2
3
q)((),`)_table
col1 col2 col3
--------------
1    1    10
2    2    20
3    3    30
person terrylynch    schedule 16.10.2017

я не могу комментировать ниже решение etc211, поэтому я только что начал еще один пост с ответом.

Hmm, functional delete doesn't seem to work when the list of columns is empty. I'd expect that not to touch the table at all, and yet it deletes all the rows in it instead. 

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

давайте предположим, что ваша таблица t содержит имена столбцов: col1,col2,col3,col4 и вы хотите удалить: col5,col6

из q-кода:

tgt_cols:`col5`col6;
filtered_cols: (cols t) inter tgt_cols;
if[0 < count filtered_cols;
    {![`t;();0b;x]} filtered_cols];

Выше сначала проверим наличие столбцов, которые вы хотите удалить; и если целевые столбцы для удаления существуют, он удалит эти столбцы.

person jeonw    schedule 16.10.2017