Functional q-SQL:如何翻译解析树的fby部分

Functional q-SQL: How to translate the fby part of the parse tree

当我 运行 从交易中解析select 时 date=max date,price=(max;price) fby sym

我得到以下解析树:

</br>

?

`trade

,((=;`date;(max;`date));(=;`price;(k){$[(#x 1)=#y;@[(#y)#x[0]0#x 1;g;:;x[0]'x..

0b

()

我尝试将其以函数形式解释为:

?[trade;((=;`date;(max;`date));(=;`price;(k){$[(#x 1)=#y;@[(#y)#x[0]0#x 1;g;:;x[0]'x..;0b;()]

但是我得到一个指向决赛的错误。我的语法有什么问题?

我认为您的第二个参数在输出中被截断了。请注意它是如何以省略号“..”结尾的。当您复制和粘贴它时,您只是选择了部分代码。

,((=;date;(max;date));(=;`价格;(k){$[(#x 1)=#y;@[(#y)#x[0 ]0#x 1;g;:;x[0]'x.. <- 此处省略号

您可以使用 fby 而不是 parse 中的 k 定义:

?[trade;(((=;`date;(max;`date));(=;`price;(fby;(enlist;max;`price);`sym))));0b;()!()]

这里有两个问题。首先是您的显示器 window 不够宽,无法显示完整输出。要调整此 window 使用 \c (console size) 命令:

q)\c 25 200
q)parse"select from trade where date=max date,price=(max;price) fby sym"
?
`trade
,((=;`date;(max;`date));(=;`price;(k){$[(#x 1)=#y;@[(#y)#x[0]0#x 1;g;:;x[0]'x[1]g:.=y];'length]};(enlist;max;`price);`sym)))
0b
()

但是,您仍然会遇到问题,因为 parse 显示 fby 的完整底层 k 定义:

q)fby
k){$[(#x 1)=#y;@[(#y)#x[0]0#x 1;g;:;x[0]'x[1]g:.=y];'length]}

注意定义前加了“k)”,导致错误。为了解决这个问题,你需要用 fby 完全替换上面的 k 定义,这样你就可以

?[trade;((=;`date;(max;`date));(=;`price;(fby;(enlist;max;`price);`sym)));0b;()]

而不是

?[trade;((=;`date;(max;`date));(=;`price;(k){$[(#x 1)=#y;@[(#y)#x[0]0#x 1;g;:;x[0]'x[1]g:.=y];'length]};(enlist;max;`price);`sym)));0b;()]

正如 Aaron Davies 几年前在 KxCon 演讲中所建议的那样,您可以使用包装函数使代码更易于阅读:

q)trade:([]date:(.z.D-1),3#.z.D;sym:(3#`AA),`BB;price:1+til 4);
q)w:{(parse"select from t where ",x). 2 0}
q)?[trade;w"date=max date,price=(max;price)fby sym";0b;()]
date       sym price
--------------------
2020.09.24 AA  3
2020.09.24 BB  4

这个“w”不会涵盖所有可能的情况use-cases,但可以扩展它以涵盖更一般的情况。