функциональная форма exec в q - PullRequest
0 голосов
/ 10 сентября 2018

рассмотрим текущий пример:

q)\l sp.q
q)exec (qty;s) from sp
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1

Я хочу написать это в функциональной форме, наиболее очевидный способ сделать это:

q)?[sp;();();(`qty;`s)]
300 300 300 300 200 300 200 200 400 200 200 200

, но это не можетдай мне правильный результат.Результат не интуитивен для меня, почему эта форма не может работать?

Я должен сделать:

q)value ?[sp;();();`qty`s!`qty`s]
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s4

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Как указал Томас - вы должны разобрать инструкцию exec и воссоздать ее вывод в функциональной форме, которая будет

q)?[sp;();();enlist,`qty`s]
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1
0 голосов
/ 10 сентября 2018

В вики только говорится, что для нескольких столбцов требуется словарь, а не почему, насколько я вижу.Чтобы увидеть, как q интерпретирует ваш запрос, вы можете использовать parse.Для запроса, который вы задали выше:

q)parse"exec (qty;s) from sp"
?
`sp
()
()
,(enlist;`qty;`s)

Здесь мы видим, что это не так просто, как передача списка имен столбцов.

Если вы хотите передать имена столбцов напрямуювы можете «выполнить» таким образом:

q)sp`qty`s
300 200 400 200 100 100 300 400 200 200 300 400
s1  s1  s1  s1  s4  s1  s2  s2  s3  s4  s4  s1

Обратите внимание, что это работает только с неоключенными таблицами в памяти (без разделов).Если таблица имеет ключ, вы можете запустить (0!sp)`qty`s, где 0! - это сочетание клавиш без столбцов.

...