舉例來說,如果我有下面的表,然後我想刪除第3行:如何在KDB中刪除連續的重複行?
Stock Price
-------------------
GOOG 101
GOOG 102
GOOG 102 <- want to remove this
GOOG 101
注:即使第4行是第1行的重複,我不想刪除它作爲它不是連續重複。也就是說,它不是上一行的重複。
我也想檢查重複多個字段,而不僅僅是Price
。
舉例來說,如果我有下面的表,然後我想刪除第3行:如何在KDB中刪除連續的重複行?
Stock Price
-------------------
GOOG 101
GOOG 102
GOOG 102 <- want to remove this
GOOG 101
注:即使第4行是第1行的重複,我不想刪除它作爲它不是連續重複。也就是說,它不是上一行的重複。
我也想檢查重複多個字段,而不僅僅是Price
。
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
您還可以使用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
有趣的是,'differ'的底層k定義似乎是jgleeson在做的事情q)不同 ~~': – JPC
不錯!我怎樣才能進一步限制它只檢查某些列上的重複項?即如果在上面的例子中也有'timestamp'列,所有的時間戳都會不同,但我仍然想擺脫'Price'中出現的相同重複。謝謝 – mchen
如果只是想要從重複比較中排除的一列或兩列,可以執行如下操作: 'd其中不是'〜'prev t:從d刪除時間戳' 否則,如果只有一列或兩列你想包括在比較中,你可以這樣做: 'd where't''prev t:select stock from d' – jgleeson