KDB查询中的求和与分组子句

编程语言 2026-07-12

我在尝试查询一个包含我订单所有操作的KDB表。我想统计在某些订单之间的物品总数,但我只想让每个订单号只被计数一次。

我已经试过

select by OrderName, sum Quantity from OrderTable where date = 2026.03.04

我在搜索时又添加了一些与问题无关的参数,但你应该理解我的意思。

它给出的答案明显偏高,而且无论是否包含 by 子句,结果都一样。

解决方案

查询语法是错误的,但不知怎的仍然以错误的方式工作,因此产生了误导性的结果。你想要的是

q)OrderTable:([]date:2#.z.D;OrderName:`A`B;Quantity:1 2);
q)select sum Quantity by OrderName from OrderTable where date = 2026.03.04
OrderName| Quantity
---------| --------
A        | 1
B        | 2

根据 https://code.kx.com/q/ref/select/ 的说明,语法是

select <columns/aggregations> by <grouping> from table where <filter>

而你拥有的是

select by <grouping> <columns/aggregations> from table where <filter>

出于好奇,之所以它还能工作,原因是:

  1. kdb不允许 <columns/aggregations>,也就是允许 select by
q)select by OrderName from OrderTable
OrderName| date       Quantity
---------| -------------------
A        | 2026.03.04 1
B        | 2026.03.04 2

它实质上给出每个OrderName的最后一行

  1. kdb允许按多列分组,例如
q)select by OrderName,date from OrderTable
OrderName date      | Quantity
--------------------| --------
A         2026.03.04| 1
B         2026.03.04| 2
  1. kdb允许将任意原子/向量成为分组的一部分,即使它实际上并不改变行的分组方式
q)select by OrderName,date,foo:`bar from OrderTable
OrderName date       foo| Quantity
------------------------| --------
A         2026.03.04 bar| 1
B         2026.03.04 bar| 2
  1. 在你的示例中,作为分组一部分的任意原子/向量恰好是所有数量的总和,与分组无关
q)select by OrderName,sum Quantity from OrderTable
OrderName Quantity| date
------------------| ----------
A         3       | 2026.03.04
B         3       | 2026.03.04

实际上与您已运行过的操作没有本质上的区别

q)select by OrderName,Quantity:99 from OrderTable
OrderName Quantity| date
------------------| ----------
A         99      | 2026.03.04
B         99      | 2026.03.04
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章