Кдб воолкуп. получить значение из таблицы, сопоставленной с наименьшим значением val, большим, чем x

Предполагая, что у меня есть дикт

d:flip(100 200 400 800 1600; 1 3 4 6 10)

Как я могу создать функцию поиска, которая возвращает значение наименьшего ключа, который больше, чем х? Учитывая стол

tbl:flip `sym`val!(`a`b`c`d; 50 280 1200 1800)

Я хотел бы сделать что-то вроде

{[x] : update new:fun[x[`val]] from x} each tbl

оказаться за таким столом

tbl:flip `sym`val`new!(`a`b`c`d; 50 280 1200 1800; 1 4 10 0N)

sym val new
a   50    1
b   280   4
c   1200  10
d   1800

2 ответа

Решение

Я думаю, что вы захотите использовать binr вернуть следующий элемент больше или равно x, Обратите внимание, что для правильной работы вы должны использовать отсортированный список. Для приведенных выше примеров преобразование d в словарь с d:(!). flip d Я придумал:

q)k:asc key d
q)d k k binr tbl`val
1 4 10 0N
q)update new:d k k binr val from tbl
sym val  new
------------
a   50   1
b   280  4
c   1200 10
d   1800

Где вы получаете ключи словаря для использования с: k k binr tbl`val,

Редактировать: если значение в таблице необходимо сопоставить со значением, превышающим x но не равно, вы можете попробовать:

q)show tbl:update val:100 from tbl where i=0
sym val
--------
a   100
b   280
c   1200
d   1800
q)update new:d k (k-1) binr val from tbl
sym val  new
------------
a   100  3
b   280  4
c   1200 10
d   1800

Пошаговые словари могут помочь http://code.kx.com/q/cookbook/temporal-data/

q)d:`s#-0W 100 200 400 800 1600!1 3 4 6 10 0N
q)d 50 280 1200 1800
1 4 10 0N
Другие вопросы по тегам