为什么 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输出
乍一看,接下来的两个查询应该给出相同的结果:
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.
在情况 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输出