2014-04-11 56 views
4

舉例來說,如果我有下面的表,然後我想刪除第3行:如何在KDB中刪除連續的重複行?

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

注:即使第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 
+0

不錯!我怎樣才能進一步限制它只檢查某些列上的重複項?即如果在上面的例子中也有'timestamp'列,所有的時間戳都會不同,但我仍然想擺脫'Price'中出現的相同重複。謝謝 – mchen

+0

如果只是想要從重複比較中排除的一列或兩列,可以執行如下操作: 'd其中不是'〜'prev t:從d刪除時間戳' 否則,如果只有一列或兩列你想包括在比較中,你可以這樣做: 'd where't''prev t:select stock from d' – jgleeson

3

您還可以使用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 
+0

有趣的是,'differ'的底層k定義似乎是jgleeson在做的事情q)不同 ~~': – JPC