【发布时间】:2021-06-30 13:38:51
【问题描述】:
乍一看,接下来的两个查询应该给出相同的结果:
q)exec a from select sum[a] from ([]a:1 2)
,3
q)exec sum[a] from ([]a:1 2)
3
但正如我们所见,它们的返回类型是不同的。
为什么这个例子中的exec 不像普通的select(只是没有列名)?
【问题讨论】:
标签: kdb
乍一看,接下来的两个查询应该给出相同的结果:
q)exec a from select sum[a] from ([]a:1 2)
,3
q)exec sum[a] from ([]a:1 2)
3
但正如我们所见,它们的返回类型是不同的。
为什么这个例子中的exec 不像普通的select(只是没有列名)?
【问题讨论】:
标签: kdb
在情况 1 中,您首先通过将 sum 函数应用于 select 语句中的 a 列来创建长度为 1 的表(select 语句的输出始终是一个表)。
然后您正在运行 exec 以从该表中提取原始列(长度为 1 的列表)。
在情况 2 中,您直接访问 exec 语句中的 a 列并在此列表上执行 sum 聚合。因此,结果将是一个标量。
第一段代码中的select 正在创建第二段代码中不存在的中间表。
关于返回类型,这也是exec 的一个特殊情况示例,您只请求一列。如果聚合多个列,结果将是一个字典(同样由标量值组成):
q)t:([]a:1 2 3;b:4 5 6)
q)exec sum a,sum b from t
a| 6
b| 15
【讨论】:
select 返回的列必须是列表,而不是原子。您的 sum 返回一个原子,但 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 不强制列/列表输出,即它允许原子输出
【讨论】:
.Q.a0的情报的?
Q.a0、a1和a2的描述吗?
q.k :)