kdb / q-如何按某些分组对行进行编号

时间:2019-12-15 04:21:24

标签: q kdb

我有带有“ date,sym”列的表。但是每个日期可能有多个符号。我想对每个日期中出现sym的次数进行计数

例如

date        sym 
-------------------
2019.06.04  ABC
2019.06.04  DEF
2019.06.04  ABC
2019.06.05  DEF
2019.06.05  ABC

会给我

date        sym   c 
-------------------
2019.06.04  ABC   1
2019.06.04  DEF   1
2019.06.04  ABC   2   / here ABC appears for the second time on this date. 
2019.06.05  DEF   1
2019.06.05  ABC   1

2 个答案:

答案 0 :(得分:5)

这可能更简洁一些,这里的c列只是按日期和符号的每种组合分组的所有行的总和。

q)t:([]date:2019.06.04+0 0 0 1 1;sym:`ABC`DEF`ABC`DEF`ABC)

q)update c:sums i=i by date,sym from t

date       sym c
----------------
2019.06.04 ABC 1
2019.06.04 DEF 1
2019.06.04 ABC 2
2019.06.05 DEF 1
2019.06.05 ABC 1

答案 1 :(得分:0)

要按日期对HDB中所有表中出现的syms进行计数,我们可以对每个分区表.Q.pt进行按日期计数,然后在pj上进行扫描并加上连接,因为每个表都按日期键(匹配键)。由于pjij类似,我们需要确保没有删除行,因为每个日期可能缺少不同的符号

q)cntTabs:{2!0!update c:count each sym,sym:first each sym from select sym by date from x} each .Q.pt
q){t:pj[x;y];t,k!y k:key[y] except key[t]}/[cntTabs]