为什么 select 和 exec 对聚合函数列给出不同的结果

Why does select and exec give different results for aggregate-function column

乍一看,接下来的两个查询应该给出相同的结果:

q)exec a from select sum[a] from ([]a:1 2)
,3
q)exec sum[a] from ([]a:1 2)
3

但正如我们所见,它们的 return 类型不同。

为什么本例中的 exec 不像常规 select(只是没有列名)?

在情况 1 中,您首先通过将 sum 函数应用于 select 语句中的 a 列来创建长度为 1 的 table(输出select 语句始终是 table).

然后您 运行 exec 从 table.

中提取原始列(长度为 1 的列表)

在情况 2 中,您直接访问 exec 语句中的 a 列,并在此列表上执行 sum 聚合。因此,结果将是一个标量。

第一段代码中的 select 正在创建第二段代码中不存在的中介 table。

关于 return 类型,这也是 exec 的一个特例,您只请求一列。如果聚合多列,结果将是一个字典(同样由标量值组成):

q)t:([]a:1 2 3;b:4 5 6)
q)exec sum a,sum b from t
a| 6
b| 15

select returns 列必须是列表,而不是原子。您的 sum returns 是一个原子,但 kdb 识别此聚合并自动在幕后征募您的原子。例如

/this works even though sum would return an atom
select sum[a] from ([]a:1 2)
/this doesn't work because kdb doesn't recognize the aggregation function
select {sum x}[a] from ([]a:1 2)
/this works by manually enlisting
select {enlist sum x}[a] from ([]a:1 2)

发生这种情况的已识别聚合列表是 .Q.a0

因此,在情况 1 中,您强制执行了一个隐藏的征募,当您执行它时,它仍然征募,在情况 2 中,没有隐藏的征募,因为 exec 不强制要求 column/list 输出,即它允许 atom输出