0
votes

Mise à jour conditionnelle de la colonne

J'ai une table de transactions comprenant la date, l'heure, le symbole, le volume, le volume de la vente aux enchères de fermeture.

Malheureusement, le volume de vente aux enchères est inclus dans la dernière poubelle de la table et pour compliquer les choses qu'elle peut survenir à 15 : 59: 00 ou à 12:59:00 pendant des demi-journées. p>

existe-t-il un moyen de mettre à jour conditionnellement le volume pour supprimer le volume de fermeture? P>

Par exemple, retirez-le du volume de 15: 59: 00 s'il existe, sinon le retirez du volume de 12: 59: 00. p>

par exemple p> xxx

Je voudrais être p>

t:([]date:2019.02.01 2019.02.01 2019.02.02 2019.02.02 2019.02.02 2019.02.02 2019.02.01 2019.02.01;time:12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00 12:59:00 15:59:00;sym:`AAPL`AAPL`AAPL`AAPL`BAC`BAC`BAC`BAC;volume:100 25000 26000 0 20000 12000 13000 0; closingvol: 24000 24000 21000 21000 11000 11000 12000 12000)

t:`date`time xasc t

update volume:volume-closingvol from t where (time=15:59:00)|(time=12:59:00), volume>=closingvol


**date**|**time**|**sym**|**volume**|**closingvol**
:-----:|:-----:|:-----:|:-----:|:-----:
2019-02-01|12:59:00|AAPL|100|24000
2019-02-01|12:59:00|BAC|1000|12000
2019-02-01|15:59:00|AAPL|1000|24000
2019-02-01|15:59:00|BAC|0|12000
2019-02-02|12:59:00|AAPL|5000|21000
2019-02-02|12:59:00|BAC|9000|11000
2019-02-02|15:59:00|AAPL|0|21000
2019-02-02|15:59:00|BAC|1000|11000

kdb

0 commentaires

3 Réponses :


1
votes

Pour le moment, les points suivants se produisent comme q évalue chaque contrainte dans la clause WHERE de droite à gauche:

q)update volume:volume-closingvol from t where (time=15:59:00)|time=12:59:00,volume>=closingvol,time=(max;time)fby ([]date;sym)
date       time     sym  volume closingvol
------------------------------------------
2019.02.01 12:59:00 AAPL 100    24000     
2019.02.01 12:59:00 BAC  1000   12000     
2019.02.01 15:59:00 AAPL 1000   24000     
2019.02.01 15:59:00 BAC  0      12000     
2019.02.02 12:59:00 AAPL 5000   21000     
2019.02.02 12:59:00 BAC  20000  11000     
2019.02.02 15:59:00 AAPL 0      21000     
2019.02.02 15:59:00 BAC  1000   11000    


1 commentaires

Merci Jomahony - Je ne pense pas que cela résout cependant. J'ai mis à jour la question avec un exemple de là où cela ne semble pas fonctionner.



0
votes

Le Vecteur conditionnel ? Code > Peut-être utile ici:

update volume:?[time in 12:59:00 15:59:00;volume-closingvol;volume] from t where vol>=closingvol


0 commentaires

0
votes

Votre exemple montre que le volume pourrait être plus grand que le volume de fermeture des deux fois - (12:59:00 15:59:00) pour la même date, symm paire. C'est pourquoi la condition 'vol> = fermeingvol' donne une réponse incorrecte (qui est utilisée par vous dans votre exemple et également utilisée dans d'autres réponses à votre message).

La solution ci-dessous fonctionnerait en fonction des hypothèses suivantes: p>

  • Tout ce qui date, sym combinaisons les deux fois - (12:59:00 15:59:00). Li>
  • Les données sont commandées par le temps. LI> ol>

    Même si les hypothèses ci-dessus ne tiennent pas dans le scénario actuel, il est très facile de changer en dessous de la requête pour travailler selon cela. P>

    date       time     sym  volume closingvol
    ------------------------------------------
    2019.02.01 12:59:00 AAPL 100    24000     
    2019.02.01 15:59:00 AAPL 1000   24000     
    2019.02.02 12:59:00 AAPL 5000   21000     
    2019.02.02 15:59:00 AAPL 0      21000     
    2019.02.02 12:59:00 BAC  20000  11000     
    2019.02.02 15:59:00 BAC  1000   11000     
    2019.02.01 12:59:00 BAC  1000   12000     
    2019.02.01 15:59:00 BAC  0      12000 
    
    

  • 0 commentaires