Объединить выбранные групповые ключи в группу KDB (Q) по запросу - PullRequest
0 голосов
/ 07 мая 2020

У меня есть запрос, который, по сути, выполняет подсчет по групповому ключу в KDB, в котором я хочу рассматривать некоторые группы как одну для целей этого запроса. Упрощенное описание того, что я пытаюсь сделать, - это подсчет заказов по клиентам за месяц, когда у меня есть пара клиентов в базе данных, которые на самом деле являются дочерними предприятиями другого клиента, и я хочу объединить счетчики дочерних компаний. со своей головной организацией. Реальный сценарий намного сложнее этого, и, не вдаваясь в ненужные подробности, достаточно сказать, что я не могу просто группировать по клиентам и манипулировать результатами для объединения счетчиков после выполнения запроса - мне нужно предложение «by» моего запрос, чтобы выполнить слияние напрямую.

В SQL я бы сделал что-то вроде этого:

select customer_id, count(*) as order_count
from orders
order by select case when customer_id = 1 then 2 when customer_id = 3 then 4 else customer_id end

В приведенном выше примере клиент 1 является дочерней компанией клиента 2, клиента 3 является дочерней компанией клиента 4, и каждый другой клиент обрабатывается нормально.

Допустим, эквивалентный код в Q (без манипуляции с клавишами группы):

select order_count:count i by customer_id from orders

Как бы я вставил эквивалентный оператор select case для управления ключом группы? Я пробовал это, но получил ошибку rank:

select order_count:count i by $[customer_id=1;2;customer_id=3;4;customer_id] from orders

У меня плохо с Q, поэтому я, вероятно, делаю очень простую ошибку. Приветствуются любые советы.

1 Ответ

0 голосов
/ 07 мая 2020

Один из подходов может заключаться в том, чтобы иметь словарь дочерних компаний и использовать поиск / повторное отображение в вашем предложении по:

q)dict:1 3!2 4
q)show t:([] order:1+til 10;customer:1+10?6)
order customer
--------------
1     1
2     1
3     6
4     2
5     3
6     4
7     5
8     5
9     3
10    5

q)select order_count:count i by customer^dict[customer] from t
customer| order_count
--------| -----------
2       | 3
4       | 3
5       | 3
6       | 1

Вы потеряете некоторую информацию о том, кто на самом деле владеет заказами, но вы ' буду знать только на родительском уровне

...