У нас есть вкладка «Таблица».
tab:update volume:0n from ([] date:2024.01.01+til 10;sym:10?`appl`msgt`googl;volume:10#(enlist 0.5+300?til 100)) where i in (1;5;8);
Мы хотим обновить объем столбца таким образом, чтобы скопировать значение сегмента индекса с 299 по 200 и сделать нулевые сегменты с 201 по 299.
Это мы можем сделать с помощью такого изменения, но изменение выдает ошибку типа, когда том пуст/нулевой.
В этом поведении мы хотим не выдавать ошибку, а возвращать пустое/нулевое значение как есть и обрабатывать только тогда, когда что-то есть в столбце тома.
//original value
first exec volume from select from tab where i=0
//updated expected values, works where volume is not null else gives type error
first exec volume from {[start;end;tab] tt:.[tab;(::;`volume;200);:;.[tab;(::;`volume;299)]]; .[tt;(::;`volume;start+til end-start);:;0f]}[201;299;select from tab where i=0]
Но это дает ошибку типа, когда объем равен нулю, когда мы передаем всю таблицу
first exec volume from {[start;end;tab] tt:.[tab;(::;`volume;200);:;.[tab;(::;`volume;299)]]; .[tt;(::;`volume;start+til end-start);:;0f]}[201;299;select from tab]
Как лучше всего проверить, равен ли объем нулю, а затем вернуть значение null/пусто, сделать что-нибудь еще, выполнить обработку что-то вроде этого
update volume:{ $[count x;"do processing here using amend"; x] }'[volume] from tab
Переключение переменных start
и end
для y
и z
соответственно.
q)update volume:{$[1=count x;x;@[;y+til z-y;:;0f]@[x;200;:;x 299]]}'[volume;201;299]from tab
@
здесь достаточно поправки, поскольку лямбда работает над каждой строкой тома, и поэтому нет необходимости индексировать на глубине.
q)update volume:{@[;y+til z-y;:;0f]@[x;200;:;x 299]}'[volume;201;299]from tab where not 1=count each volume
Если с некоторыми не работает, то приятно их отфильтроватьwhere