kdb - хороший способ заказа символов - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица kdb, содержащая будущие данные, а месяцы до истечения срока контракта хранятся в виде символов, таких как `M0`M1`M2... et c. Я хочу заказать это по истечении срока действия, чтобы получить список вроде `M1``M2`M3 et c, но когда я использую как c, я получаю `M1`M11`M12...`M2`21... et c. Я полагаю, что один из способов достижения моей цели состоит в том, чтобы обрезать приведение M к целому числу, отсортировать и затем преобразовать обратно в строку, добавить M назад и затем привести к символу. Но это похоже на долгий путь. Мне просто интересно, есть ли лучший подход?

1 Ответ

4 голосов
/ 17 марта 2020

Я думаю, что я воспроизвел простую версию вашей проблемы с:

q)t:([] a:`a`b`c`d`e`f; b:`M1`M4`M2`M21`M12`M11)
q)`num xasc update num: "I"$1_'string b from t
a b   num
---------
a M1  1
c M2  2
b M4  4
f M11 11
e M12 12
d M21 21

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

delete num from `num xasc update num: "I"$1_'string b from t

для возврата к нужной таблице.

Примечание: это решение предполагает, что форма месяцев столбец expiry всегда M(months)

Более кратким методом может быть преобразование b в байты с -8!, используя что-то вроде:

q)`num xasc update num:-8!'b from t
a b   num
----------------------------------
a M1  0x010000000c000000f54d3100
c M2  0x010000000c000000f54d3200
b M4  0x010000000c000000f54d3400
f M11 0x010000000d000000f54d313100
e M12 0x010000000d000000f54d313200
d M21 0x010000000d000000f54d323100

, но этот метод будет просто немного медленнее.

...