我想在Q / KDB中执行查询,以检索满足以下条件的行。
初始表
completed name month
--------------------
yes x 1
no x 1
yes y 2
yes y 2
no a 3
yes a 4
yes b 4
no b 4
no b 4
yes y 5
初始表按月划分
completed name month
--------------------
yes x 1
no x 1
---------------------
yes y 2
yes y 2
--------------------
no a 3
--------------------
yes a 4
yes b 4
no b 4
no b 4
--------------------
yes y 5
结果表:
completed name month
--------------------
yes y 2
yes a 4
yes y 5
说明:
在 1 月中,只有 x 交易,但尚未完成一笔交易,因此不在我们的最终列表中。
在月份 2 中,只有 y 交易完成了两个交易,因此它位于我们的最终列表中。
在第 3 月中,只有 a 交易,但交易未完成。
在 4 月, a 和 b 均已交易,但由于 b 交易未完成,将其排除在外。
在月份 5 中,仅进行了 y 交易,因此将其添加到最终表中。
答案 0 :(得分:4)
您好,您可以在右侧使用副词和fby过滤器来使用以下内容
distinct select from tab where ({all`yes=/:x};completed)fby([]name;month)
为简便起见,您可能还想对完成的列使用布尔向量
答案 1 :(得分:1)
可能不是最q-ist的答案,但至少它能起作用:
t: ([]completed:`yes`no`yes`yes`no`yes`yes`no`no`yes; name:`x`x`y`y`a`a`b`b`b`y;month:1 1 2 2 3 4 4 4 4 5)
(cols t) xcols `month xasc ungroup {select from x where all each completed = `yes} select distinct completed by name,month from t
completed name month
--------------------
yes y 2
yes a 4
yes y 5
答案 2 :(得分:0)
如果使用DolphinDB而不是kdb +,则解决方案将更具可读性。
tbl = table(1 0 1 1 0 1 1 0 0 1 as completed, `x`x`y`y`a`a`b`b`b`y as name, 1 1 2 2 3 4 4 4 4 5 as month)
select top 1 * from tbl context by month, name having min(completed)=1
completed name month
--------- ---- -----
1 y 2
1 a 4
1 y 5
sql语句中的子句context by
与group by
类似。但这并不要求select
子句中的所有列都是聚合值。而且,它可以与having
子句一起使用以过滤组。 top n
子句适用于每个组。