2016-11-09 6 views
0

Можно ли применить атрибут таблицы, используя строку имени столбца?Можно ли применить атрибут таблицы: 1) используя строку с именем столбца, 2) используя переменную таблицы?

Например (не работает):

t: flip `ti`p!(10:00:01 19:00:02; 77.7 88.8) 
update `p#"ti" from `t 

Кроме того, я могу обновить атрибуты списка таблиц?

Например:

t1: flip `ti`p!(10:00:01 19:00:02; 77.7 88.8) 
t2: flip `ti`p!(10:00:01 19:00:02; 77.7 88.8) 
lst: (t1; t2) 
/How can I apply `p#ti on all the elements of "lst" 
/(i.e. acting on lst[0] and lst[1])? 

/does not always work: 
i:0; while[i<=1; t: lst[i]; update `p#ti from `t; lst[i]: t; i:i+1]; 

Большое спасибо за вашу помощь!

+0

В вопросе №1: Я ищу решение, которое будет работать на локальных таблицах. В вопросе №2: Решение может использовать только «lst» (не может использовать t1, t2). Представьте, что у вас 2000 таблиц - похоже, это хорошее решение, чтобы перечислить их все по одному вручную? –

+0

Относительно # 1 - Решение работает для местных жителей, если вы передаете таблицу вместо представления символа. Вы также можете передать символ своей функции, а затем использовать значение, чтобы получить представление таблицы. Относительно # 2 - я обновил ответ ниже, чтобы добавить некоторую информацию о переменных. – user2242865

ответ

3

Один из способов сделать это с functional amend:

q)@[`t;`ti;`p#] 
`t 

q)show meta t 
c | t f a 
--| ----- 
ti| v p 
p | f 

Вы можете создать проекцию и работать над каждой таблицы:

q)@[;`ti;`p#] each `t1`t2 
`t1`t2 

Список таблиц может содержаться в переменной, которая вы можете заполнить программно (в этом случае я просто создаю переменную, вызывая таблицы []):

tabs:tables[] 
q)@[;`ti;`p#] each tabs 
`t1`t2 
1

Функциональное обновление другой вариант: http://code.kx.com/q4m3/9_Queries_q-sql/#9123-functional-update

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

q)f:{[tablename;column]![tablename;();0b;(enlist `$column)!enlist (#;enlist `p;`$column)]} 
q)f[`t1;"ti"] 
`t1 

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

q)f[;"ti"]each`t1`t2 
+0

Как-то, метод применения разделенных атрибутов работает только с глобальными переменными. Например: t1: flip 'ti'p! (10:00:01 19:00:02; 77.7 88.8); ApplyPartedAttribute: {[tableSym; columnName]! [TableSym;(); 0b; (зачислить '$ columnName)! enlist (#; заручиться' p; '$ columnName)]}; ApplyPartedAttribute ['t1; "ти"]; meta t1 работает должным образом. Но не Тест: {t1: flip 'ti'p! (10:00:01 19:00:02; 77.7 88.8); ApplyPartedAttribute: {[tableSym; columnName]! [TableSym;(); 0b; (зачислить '$ columnName)! enlist (#; заручиться' p; '$ columnName)]}; ApplyPartedAttribute [ 't1; "ти"]; показать мета t1; } –

+0

Оба пользователя @ user2242865 и вы используете имена элементов для применения атрибута в списке таблиц, в то время как суть вопроса заключается в том, «как это сделать, если они недоступны, т.е. доступен только« lst »» –

+0

Как вы строите содержимое переменной зависит от вас. Мое решение показывает, как использовать переменную. – user2242865