Напишите запрос Q-SQL, чтобы умножить цену BA.N на 2, GS.N на 3 и MSFT.O на 4 и вызвать столбец NewPrice с помощью векторного условного оператора

#kdb

#кдб

Вопрос:

Напишите запрос Q-SQL, чтобы умножить цену BA.N на 2, GS.N на 3 и MSFT.O на 4 и вызвать столбец NewPrice с помощью векторного условного оператора

 tab2:`syms`prices!(`MSFT.O`GS.N`BA.N;45.15 191.10 178.50)
flip tab2

select syms,prices,newPrice:(prices*(4,3,2)) from flip tab2
 

Ответ №1:

Я не уверен, что использование векторного условного выражения было бы самым простым способом добиться этого. Например, вы могли бы использовать простой словарь для достижения аналогичного эффекта. Сначала определите словарь, сопоставляющий ваши символы с их множителями, а затем используйте этот словарь в инструкции select:

 tab2: flip `syms`prices!(`MSFT.O`GS.N`BA.N;45.15 191.10 178.50)
d: `MSFT.O`GS.N`BA.N!4 3 2;

select syms, prices, newPrice: prices*d[syms] from tab2
syms   prices newPrice
----------------------
MSFT.O 45.15  180.6
GS.N   191.1  573.3
BA.N   178.5  357
 

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

 select syms, prices, newPrice: ?[syms=`MSFT.O; prices*4; ?[syms=`GS.N; prices*3; ?[syms=`BA.N;prices*2;prices]]] from tab2
 

Но это быстро становится громоздким и плохо масштабируется. Если бы вы добавили больше символов, было бы легко обновить словарь, но неприятно обновлять условное обозначение.

Ответ №2:

Вы должны создать карту множителей

 (`MSFT.O`GS.N`BA.N!2 3 4)
 

и умножьте каждую цену на значение из карты на основе символов строк:

 update newPrice: prices*(`MSFT.O`GS.N`BA.N!2 3 4)syms from flip tab2