#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
формой, которая есть у меня в ответе, это позволит избежать этой ошибки. Вы также можете изменить свой=
на anin
, чтобы он работал в его текущей форме (хотя это не будет работать во всех случаях).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. Я бы, вероятно, тоже подошел к этому более динамично, но со словарем дат в таблицах