Как соединить слева каждый элемент списка с каждым элементом другого списка - PullRequest
1 голос
/ 02 апреля 2019

У меня есть 2 списка, которые содержат 50 таблиц в каждом списке. Каждая таблица в каждом списке имеет столбец с именем ID ...

count list1
50
count list2
50

Я хотел бы иметь возможность выполнить левое соединение для каждой таблицы в списке с каждой таблицей во втором списке (используя столбец ID в качестве ключевого столбца), а затем сохранить результаты каждого объединения в отдельная переменная для каждого соединения.

Я могу выполнить левое соединение для каждой таблицы индивидуально (на примере таблицы с индексом 27), выполнив следующие действия. Это дает желаемые результаты для таблицы на 27-м индексе ...

table27:list1[27] lj `ID xkey list2[27]

Как я могу перебрать список таблиц, объединяя каждую таблицу с соответствующими индексами и сохраняя эту таблицу в переменной до того, как выполнить ту же операцию со следующим набором таблиц?

Чтобы присоединиться к таблицам, я попробовал следующее ...

joinedLists:each list1 lj `ID xkey each list2
joinedLists:(each list1) lj `ID xkey each list2
joinedLists:(each list1) lj' `ID xkey each list2
joinedLists:lj/[(each list1;each list2)]
joinedLists:lj/'[(each list1;each list2)]
joinedLists:list1[1+til 51] lj `ID xkey list2[1+til 51]

Хотя все вышеперечисленные запросы, кроме последнего, приводят к загадочному сообщению об ошибке '. Последний запрос, который я пробовал, дает результат, но при дальнейшей проверке таблиц в этом списке пропускается столбец, а количество не соответствует ожидаемому ...

count each list1
913930 799359 53212 20 70 6 116 8 139 16 74 28 3 69 11 137 6 22 42 123 5 23 16 1 13 26 26 9 93 11 2 1 2 2 14 2 1 15 3 11 25 7 4 3 1 2 6 9 1 2 1
count each list2
274506 440675 44935 20 70 6 101 6 138 15 71 27 3 63 10 133 6 21 42 123 3 16 11 1 12 25 26 13 92 10 2 1 2 2 14 2 1 15 3 11 25 7 4 3 1 2 6 30 1 2 1
count each joinedLists
799410 53263 71 121 57 167 59 190 67 125 79 54 120 62 188 57 73 93 174 56 74 67 52 64 77 77 60 144 62 53 52 53 53 65 53 52 66 54 62 76 58 55 54 52 53 57 60 52 53 52 51

Ответы [ 2 ]

5 голосов
/ 02 апреля 2019

Пример ниже с двумя таблицами в каждом списке:

q)list1:(([]ID:1 2 3;b:4 5 6);([]ID:6 7 8;b:9 10 11))
q)list2:(([]ID:1 2 3;b:14 15 16);([]ID:6 7 8;b:19 20 21))
q){[t1;t2] list3,:enlist t1 lj `ID xkey t2}'[list1;list2];
q)list3
+`ID`b!(1 2 3;14 15 16)
+`ID`b!(6 7 8;19 20 21)

каждый из обоих (') используется для применения функции по пунктам в обоих списках.

,: используется для глобального объединения каждого зачисленного результата и присвоения переменной list3

0 голосов
/ 03 апреля 2019

Это также должно работать, если столбец идентификатора всегда первый:

q)list1 lj'1!'list2
+`ID`b!(1 2 3;14 15 16)
+`ID`b!(6 7 8;19 20 21)
...