在kdbselect语句中计算t与实际数量
我注意到以下几点
select (count t)#`test from t
退货
flip (enlist `x)!enlist enlist `test`test`test
对比
select 3#`test from t
哪个返回
flip (enlist `x)!enlist `test`test`test
与select (sum 1 2)#1 from tvsselect(1 + 2)#1 from t等类似
任何人都知道为什么选择中的关键字似乎导致返回是一个包含一行嵌套列表的表,其中包含 x 元素与一个包含 x 行的表?
回答
这是因为 kdb 将count和识别sum为聚合并对它们进行特殊处理(它获取结果)。
例如,如果您将countand稍微更改sum为 lambdas(kdb 无法识别),您会得到您期望的其他结果:
q)select ({count x}t)#`test from t
x
----
test
test
test
q)select ({sum x}1 2)#1 from t
x
-
1
1
1
kdb“识别”某些常见聚合并自动登记它们的原因是因为否则简单的选择select sum a from tab会给出排名错误,因为总和返回一个原子但表列必须是一个列表,例如
q)select {sum x}a from t
'rank
[0] select {sum x}a from t
^
/versus
q)select sum a from t
a
-
6
还有一个更深层次的原因与数据库分区上的映射/减少聚合有关,但这超出了这个问题的范围。已识别聚合的列表存储在变量中.Q.a0。另见https://code.kx.com/q/basics/qsql/#special-functions