2009-02-04 6 views
3

J'utilise SQL et j'ai une table avec trois colonnes: compte, transaction_date, Points. Chaque compte aura plusieurs transactions_dates et points gagnés pour chaque transaction. Comment puis-je retourner le transaction_date lorsque chaque compte a atteint un certain seuil (c'est-à-dire 100 points accumulés). Supposons que le premier compte compte 2 000 transactions et que les cinq premiers aient chacun 21 points. Je voudrais que la requête retourne la transaction # 5 parce que c'est quand le compte a atteint 100.Comment retourner un enregistrement lorsque la somme a atteint un certain seuil

Quelqu'un peut-il aider? Merci! Cat

+0

Quel SGBD? MySQL? Serveur SQL? Oracle? etc. –

+0

Voulez-vous dire que ce sont des points gagnés à une date précise? Donc 11111 franchirait le seuil de 100 pt le 14/08/2007 (27 + 23 + 59> 100), non? –

+0

SQL Server et Oui, vous avez raison. 27 + 23 + 59> 100 - Je devrais retourner la date du 59 Points –

Répondre

2
select min(a.transaction_date), a.account from 

(select sum(t1.points) as thesum, t2.transaction_date, t2.account 
from table t1 
inner join table t2 on t1.account = t2.account and t1.transaction_date <= t2.transaction_date 
group by t2.transaction_date, t2.account 
having thesum >= 100) a 

group by a.account 
+0

Excellent! Ça a marché! Merci beaucoup! –

0

Ceci devrait vous donner ce que vous recherchez.

SELECT account_id, MIN(transaction_date) FROM table t1 WHERE (SELECT SUM(points) FROM table t2 WHERE t2.transaction_date < t1.transaction_date) <= 100 GROUP BY account_id

0

Vous pouvez le faire en utilisant un curseur dans une procédure stockée. Ensuite, vous pouvez simplement parcourir les enregistrements du compte et accumuler les points. Dès que vous passez le seuil, vous retournez l'enregistrement en cours.

Mais ce sera probablement assez lent si vous avez un grand ensemble de données, donc si vous connaissez le (s) seuil (s) que vous recherchez avant d'exécuter la requête, vous pouvez ajouter une table supplémentaire où vous marquez les enregistrements où vous franchissez les seuils vous êtes après. La mise à jour de cette table supplémentaire pourrait être effectuée dans un déclencheur sur la table des transactions.

+0

Pas besoin de curseur ou de table supplémentaire ici. –

+0

Je viens de voir votre message. Joli! –

1

Utilisez triangulaire rejoindre:

Dans T-SQL:

SELECT account, MIN(dt), MIN(points) 
FROM 
(
    SELECT t1.account, t1.date, sum(t2.points) AS points 
    FROM table t1 
     INNER JOIN table t2 ON t1.account = t2.account AND t1.dt >= t2.dt 
    GROUP BY t1.account, t1.date 
    HAVING SUM(t2.points) > 100 
) iq 
GROUP BY account 
Questions connexes