J'ai une table (commandes) dans PostgreSQL, Schema et données sont comme ceci:
SELECT * FROM (
SELECT *, SUM(qty) OVER (ORDER BY price ASC) as total_qty FROM orders
WHERE symbol = 'BTCUSDT' AND side = 'SELL' AND status = 'NEW'
) AS o WHERE o.total_qty <= 0.5
3 Réponses :
Vous devrez garder deux somme code> s. Un pour la ligne actuelle et une autre pour la ligne précédente. Ensuite, le filtrage est facile. Par exemple: select *
from (
SELECT *,
SUM(qty) OVER (partition by side, status ORDER BY price ASC) as total_qty,
SUM(qty) OVER (partition by side, status ORDER BY price ASC
rows between unbounded preceding and 1 preceding) as prev_total_qty
FROM orders
WHERE symbol = 'BTCUSDT' AND side = 'SELL' AND status = 'NEW'
) AS o
WHERE coalesce(prev_total_qty, 0) <= 0.5
Vous voulez toutes les lignes jusqu'à la ligne où la somme est égale ou dépasse Voir le Démo . 0.5 code>.
Cela signifie que si vous soustrayez qté code> à partir de la somme de la dernière ligne que vous souhaitez renvoyer, le résultat doit être inférieur à Qté code>.
Soustraire qté code> à partir de la somme et retirez le signe égal du où code> clause:
Résultats: P> | id | symbol | qty | price | side | status |
| --- | ------- | ---- | ----- | ---- | ------ |
| 1 | BTCUSDT | 0.02 | 6500 | SELL | NEW |
| 2 | BTCUSDT | 1.00 | 6550 | SELL | NEW |
S'il vous plaît expliquer la solution
Vous êtes vraiment sur la bonne voie. La question est que la somme cumulative comprend em> la ligne actuelle. Donc, votre Vous pouvez également utiliser un cadre de fenêtre comme un impalaler, mais qui introduit le problème de où code> clause le filtre quand il passe 0,5. La solution simple consiste à soustraire la valeur de la ligne en cours: null code> valeurs sur la première ligne. Vous pouvez également soustraire le montant de la sous-requête sous forme de FORPAS. Dans tous les cas, l'idée est la même: vous avez besoin de la quantité accumulée avant em> chaque ligne. P> p>
Cette requête échoue dans le cas où la Qté = 0,5 à la 1ère rangée, car dans ce cas, le résultat ne doit être que la 1ère rangée, mais il renvoie 2: db-fiddle.com/f/9xm7jv5eprmzrn72xHepon/4
@ forpas. . . La question se lit comme suit: "Ordre par prix ascendant jusqu'à ce que la somme (Qté) soit supérieure à 0,5,".
Mais la condition de l'opération: où o.total_qty <= 0.5 code> implique jusqu'à ce que la somme soit égale ou supérieure à 0.5. Pour que les échantillons de données affichés, le résultat attendu contient 1 ligne supplémentaire car la somme n'est pas égale à 0,5.