【问题标题】:Why does select and exec give different results for aggregate-function column为什么 select 和 exec 为聚合函数列给出不同的结果
【发布时间】: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


    【解决方案1】:

    在情况 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
    

    【讨论】:

      【解决方案2】:

      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的情报的?
      • 以前在 wiki 中:请参阅 groups.google.com/g/personal-kdbplus/c/vPosmdAAUj4 中的参考文献。但是现在任何地方都有Q.a0a1a2的描述吗?
      • 一个很好的案例让我彻底阅读q.k :)
      • 很好的发现。这是您将在 .Q.a012 上获得的最佳文档。正式地,他们不应该被弄乱,所以他们不会被记录在案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2017-04-29
      • 2021-12-07
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多