例如,如果我有下表,那么我想删除第3行:
Stock Price
-------------------
GOOG 101
GOOG 102
GOOG 102 <- want to remove this
GOOG 101
Run Code Online (Sandbox Code Playgroud)
注意:即使第4行是第1行的副本,我也不想删除它,因为它不是连续的副本.也就是说,它不是紧接在上面的行的副本.
我还想检查多个字段中的重复项,而不仅仅是Price.
小智 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
Run Code Online (Sandbox Code Playgroud)
您还可以使用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
Run Code Online (Sandbox Code Playgroud)
现在让我们假设有一个时间列,正如您在上面的评论中指出的那样
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
Run Code Online (Sandbox Code Playgroud)
为了简单起见,现在回到没有时间列的 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
Run Code Online (Sandbox Code Playgroud)