Оба ответа здесь замечательные, но не дают подробных сведений о том, почему вы получили ошибку 'length
. Ошибка была полностью в вашем where
предложении where instr_id = id, tp_time < time
. Когда вы передали список элементов, вы фактически создали список логических списков, которые передаются предложению where. Настройка двух примеров списков, чтобы выделить это:
q)show instr_id:-5?10
2 8 0 1 6
q)show tp_time:5?.z.t
01:05:42.696 03:42:39.320 17:44:49.101 15:01:01.470 05:47:49.777
Выполнение вашего первого условия instr_id = id
с атомами и списками:
q)instr_id=2
10000b
q)instr_id=2 8
'length
[0] instr_id=2 8
^
Использование =
будет работать только для атома списка равной длины instr_id
. Если вы хотите передать несколько элементов в соответствие, вы можете вместо этого использовать in
:
q)instr_id in 2
10000b
q)instr_id in 2 8
11000b
Для второго условия tp_time < time
снова требуется передать атомы или списки одинаковой длины:
q)tp_time<.z.t
11111b
q)tp_time<.z.t,.z.t
'length
[0] tp_time<.z.t,.z.t
^
Можно обойти это, используя наречия, такие как по-правому /:
, чтобы сравнить tp_time
с несколькими элементами, и используя any
, чтобы сократить его до одного списка:
q)tp_time</:.z.t,.z.t
11111b
11111b
q)any tp_time</:.z.t,.z.t
11111b
Надеюсь, это поможет вам понять, где вы столкнулись с вышеуказанными проблемами.