KDB查询中的求和与分组子句
我在尝试查询一个包含我订单所有操作的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>
出于好奇,之所以它还能工作,原因是:
- 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的最后一行
- kdb允许按多列分组,例如
q)select by OrderName,date from OrderTable
OrderName date | Quantity
--------------------| --------
A 2026.03.04| 1
B 2026.03.04| 2
- 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
- 在你的示例中,作为分组一部分的任意原子/向量恰好是所有数量的总和,与分组无关
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。