У меня есть функция, которая фильтрует главную таблицу, как показано ниже:
condSel:{[tabl;colNames;colValues]
wc: {(in;x;enlist y)}.'flip(colNames;colValues);
res: ?[tabl;wc;0b;()];
res
Я могу применить это отдельно для фильтрации по двум столбцам в моей основной таблице:
res_fltr1: condSel[t;enlist `s; enlist `s1];
res_fltr2: condSel[t;enlist `name; enlist `$("P Willy";"D Reim")];
Но только когда я пытаюсь объединить эти два столбца внутри функции фильтра, я получаю ошибку несовместимого списка, которую я очень не уверен, как исправить:
res_fltr: condSel[t;`s`name;`s1`$("P Willy";"D Reim")];
Что мне здесь не хватает? Если я попытаюсь сделать это со столбцами s
и p
вместо того, чтобы передать по одному символу для каждого столбца, то проблем не возникнет.
res_fltr: condSel[t;`s`p;`s1`p1];
Фиктивная таблица ниже:
s p qty name
------------------
s1 p1 300 F James
s1 p2 200 P Willy
s1 p3 400 P Willy
s1 p4 200 D Reim
s4 p5 100 M Oxhart
s1 p6 100 P Willy
...
Этот синтаксис неверен:
q)`s1`$("P Willy";"D Reim")
'type
[0] `s1`$("P Willy";"D Reim")
Вам нужно присоединиться к ним, используя ,
:
q)`s1,`$("P Willy";"D Reim")
`s1`P Willy`D Reim
Вы когда-нибудь пытались запустить выражение третьего параметра на консоли вне функции? Выдает ошибку типа. Ваш синтаксис неверен. Во-вторых, присоединиться к обоим ,'
— это не то же самое, что присоединиться ,
. Вы создаете список списков с объединением каждого из них, ваша функция ожидает один список.
Эй, я использую здесь апостроф вместо тильды из-за синтаксиса Stack. Я действительно использовал тильды и не пытался присоединиться к каждому, но это все равно не работает. Как ни странно, замена двух переменных местами, как вы, работает нормально, но если я сначала сделаю это с name
, то s
, похоже, не сработает.
Синтаксис неверен. kdb+ оценивается справа налево, вы пытаетесь присоединить символ к списку строк, а затем преобразовать его в символ
Ааа, хорошо, я понимаю, что выполнение (`$("P Willy";"D Reim")),'s1
, кажется, объединяет их правильно, но это создает список из трех символов, дающий ошибку длины, поскольку я передаю только два столбца. Как я могу изменить приведенное выше, чтобы оно передавалось в двух символах, один из которых представлял собой список строк, преобразованных в символы, а другой был просто символом s1
?
((`$("P Willy";"D Reim"));`s1)
кажется работает, спасибо за помощь!
res_fltr: condSel[t;'name's;'$("P Willy";"D Reim"),'s1];
---> не работает, возвращает ошибку "несоответствующие типы