Comment supprimer les lignes consécutives en double dans KDB ?
Question
Par exemple, si j'ai le tableau ci-dessous, je souhaite supprimer la 3ème ligne :
Stock Price
-------------------
GOOG 101
GOOG 102
GOOG 102 <- want to remove this
GOOG 101
Note:même si la ligne 4 est un double de la ligne 1, je ne veux pas la supprimer car ce n'est pas un consécutif dupliquer.Autrement dit, il ne s’agit pas d’un double de la ligne située immédiatement au-dessus.
Je voudrais également vérifier les doublons dans plusieurs champs, pas seulement Price
.
La solution
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
Autres conseils
Vous pouvez aussi utiliser 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
supposons maintenant qu'il y ait une colonne de temps, comme vous l'indiquez dans votre commentaire ci-dessus
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
Revenons maintenant au t sans colonne de temps, pour plus de simplicité.Cela vous permet d'accélérer par rapport à la méthode alternative proposée par @jgleeson (ce que je trouve génial, mais une accélération est toujours la bienvenue, alors j'ai pensé que je partagerais cela malgré tout)
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