Сохранение выходных данных итерационной функции в уникальных таблицах KDB /Q

#kdb

Вопрос:

У меня есть функция запроса формата:

function:{[x] select Y from table1 where date=x}

Я хочу повторить эту функцию во всех днях, хранящихся в отдельной таблице, вот так

function each (select distinct date from table2)

и сохраняйте каждую итерацию в своей собственной уникальной таблице. Например, если первая итерация была для 2021.11.10, все значения » Y «из таблицы 1 на эту дату хранятся в таблице с именем «a», для следующей итерации на дату 2021.11.12 она переходит в таблицу с именем » b » или что-то в этом роде. Как я могу это сделать?

Комментарии:

1. Для уточнения, запуск этой функции как есть генерирует ошибку длины, так как результатом является таблица для каждой итерации. Отсюда необходимость в месте для размещения таблицы каждой итерации где-то

2. Я только что видел это разъяснение — вы получаете ошибку длины, потому что вы передаете каждый элемент вывода select инструкции. В этом случае каждый элемент является словарем. Если вы воспользуетесь exec формой, которая есть у меня в ответе, это позволит избежать этой ошибки. Вы также можете изменить свой = на an in , чтобы он работал в его текущей форме (хотя это не будет работать во всех случаях).

3. Честно говоря, иметь в каждой выходной таблице свою собственную переменную-не очень хорошая идея. Это может быть словарь дат для выходных данных, как предложил Мэтт ниже. Или вы можете использовать group или xgroup сгруппировать таблицу с помощью col даты (если это такая простая функция, как предполагает ваш пример).

Ответ №1:

Предположим, что в следующих таблицах:

 q)t1:([]date:.z.d   0 0 0 1 1 1;a:1 2 3 4 5 6) q)t2:([]date:.z.d 0 1)  

тогда вы могли бы сделать что-то вроде:

 q)function:{[x;y] x set select from t1 where date=y} q)function'[`a`b;exec distinct date from t2] `a`b q)show a date a ------------ 2021.11.10 1 2021.11.10 2 2021.11.10 3 q)show b date a ------------ 2021.11.11 4 2021.11.11 5 2021.11.11 6  

Если бы вы хотели сделать его немного более динамичным, вы также могли бы сделать что-то вроде:

 q)function:{[x] (`$"tab",string[x] except ".") set select from t1 where date=x} q) q) q)function each exec distinct date from t2 `tab20211110`tab20211111 q)show tab20211110 date a ------------ 2021.11.10 1 2021.11.10 2 2021.11.10 3 q)show tab20211111 date a ------------ 2021.11.11 4 2021.11.11 5 2021.11.11 6  

Вышесказанное создает новые таблицы с именами для каждой даты (мы удаляем «.» из результирующих имен, так как их можно спутать с . оператором q).

Комментарии:

1. Я бы, вероятно, тоже подошел к этому более динамично, но со словарем дат в таблицах