0
votes

Sélectionnez des lignes minimales jusqu'à la somme d'une colonne supérieure à une valeur

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


0 commentaires

3 Réponses :


0
votes

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


0 commentaires

0
votes

Vous voulez toutes les lignes jusqu'à la ligne où la somme est égale ou dépasse 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: xxx pré>

Voir le Démo .
Résultats: P>

| id  | symbol  | qty  | price | side | status |
| --- | ------- | ---- | ----- | ---- | ------ |
| 1   | BTCUSDT | 0.02 | 6500  | SELL | NEW    |
| 2   | BTCUSDT | 1.00 | 6550  | SELL | NEW    |


1 commentaires

S'il vous plaît expliquer la solution



0
votes

Vous êtes vraiment sur la bonne voie. La question est que la somme cumulative comprend la ligne actuelle. Donc, votre clause le filtre quand il passe 0,5. La solution simple consiste à soustraire la valeur de la ligne en cours: xxx

Vous pouvez également utiliser un cadre de fenêtre comme un impalaler, mais qui introduit le problème de null 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 chaque ligne.


3 commentaires

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 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.