如何在KDB中删除连续的重复行?

时间:2014-04-11 14:19:47

标签: kdb q-lang

例如,如果我有下表,那么我想删除第3行:

Stock   Price
-------------------
GOOG    101
GOOG    102
GOOG    102     <- want to remove this
GOOG    101

注意:即使第4行是第1行的副本,我也不想删除它,因为它不是连续重复。也就是说,它不是紧接在上面的行的副本。

我还想检查多个字段中的重复项,而不仅仅是Price

2 个答案:

答案 0 :(得分:7)

d:([]Stock:4#`GOOG;Price:101 102 102 101)
q)d
Stock Price
-----------
GOOG  101
GOOG  102
GOOG  102
GOOG  101

q)d where not d~'prev d
Stock Price
-----------
GOOG  101
GOOG  102
GOOG  101

答案 1 :(得分:4)

您也可以使用differ

q)t:([]stock:4#`GOOG; price:101 102 102 101)
q)differ t
1101b
q)t where differ t
stock price
-----------
GOOG  101
GOOG  102
GOOG  101

现在让我们假设有一个时间列,正如您在上面的评论中指出的那样

q)t:update time:til count i from t
q)t
stock price time
----------------
GOOG  101   0
GOOG  102   1
GOOG  102   2
GOOG  101   3
q)t where differ `stock`price#t
stock price time
----------------
GOOG  101   0
GOOG  102   1
GOOG  101   3

为简单起见,现在回到没有时间列的t。这让你加速了@jgleeson提出的替代方法(我觉得这很好,但总是欢迎加速,所以我认为我会分享这个)

q)\ts do[10000;r:t where differ t]
31 1184j
q)\ts do[10000;r2:t where not t~'prev t]
62 1488j
q)r~r2
1b