Проверьте наличие столбца во всех таблицах и, если столбец присутствует, выведите имя таблицы - kdb - PullRequest
0 голосов
/ 15 июня 2019

У нас есть 3 таблицы с столбцами ниже в нашем текущем пространстве имен

q)t:([] a:`a`b`c; b:1 2 3);
q)s:([] a:`a`b`c; b:1 2 3);
q)z:([] z:`a`b`c; b:1 2 3);

Теперь мы хотим найти и распечатать все таблицы, в которых есть столбец a.

Expected output: `a`s

У меня есть дванекрасивое решение, которое несколько работает

q){$[`a in cols x;x;]} each tables[];
q){(enlist x) where enlist(`a in cols x)}each tables[];

Но в поисках лучшего оптимального решения.

Ответы [ 2 ]

3 голосов
/ 15 июня 2019

Если это то, что вы хотели бы параметризовать и использовать снова, вам может пригодиться что-то вроде следующего прогноза:

f:{[t;c]c!t@/:where each flip(c,:())in/:cols each t}[tables[]];

Эта функция выдает следующий вывод

q)f`a
a| s t
q)f`a`b
a| `s`t
b| `s`t`z

Таким образом, он отображает имя столбца в список таблиц, содержащих этот столбец. Такое отображение часто может быть более выгодным, чем работа с простыми списками, поскольку позволяет быстро и разборчиво индексировать.

q)coldict:f`a`b
q)coldict[`a]
`s`t
2 голосов
/ 15 июня 2019

Лучше всего использовать каждое право (/:) наречие с in:

q)tables[] where `a in/: cols each tables[]
`s`t
...