KDB / Q查询每月符合条件的行

时间:2019-06-18 08:10:43

标签: kdb

我想在Q / KDB中执行查询,以检索满足以下条件的行。

  1. 一个月内具有相同名称的行只能标记为已完成。
  2. 名称应该是不同的,即,如果它们满足条件1,则它们应仅以单数形式出现。

初始表

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. 1 月中,只有 x 交易,但尚未完成一笔交易,因此不在我们的最终列表中。

  2. 在月份 2 中,只有 y 交易完成了两个交易,因此它位于我们的最终列表中。

  3. 在第 3 月中,只有 a 交易,但交易未完成。

  4. 4 月, a b 均已交易,但由于 b 交易未完成,将其排除在外。

  5. 在月份 5 中,仅进行了 y 交易,因此将其添加到最终表中。

3 个答案:

答案 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 bygroup by类似。但这并不要求select子句中的所有列都是聚合值。而且,它可以与having子句一起使用以过滤组。 top n子句适用于每个组。