#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