当总和达到一定阈值时如何返回记录

3
我正在使用SQL,并且我有一个包含三列的表:account(账户),transaction_date(交易日期),Points(积分)。 每个账户将具有多个transaction_dates和每次交易所获得的Points。
当每个账户达到一定门槛(即累计100 Points)时,如何返回transaction_date。例如,第一个账户有2000笔交易,前五个交易每个交易21 Points。我希望查询返回第5笔交易,因为这是该账户达到100 Points的时间点。
谁能帮忙? 谢谢! Cat

什么数据库管理系统?MySQL?SQL Server?Oracle?等等。 - Matt Rogish
你的意思是这些分数是在特定日期获得的吗?所以11111会在2007年08月14日跨过100分的门槛(27+23+59 > 100),对吗? - Matt Rogish
SQL Server和是的,你说得对。27+23+59>100 - 我需要返回59分的日期。 - Cat
请参考这个问题:https://dev59.com/jEXRa4cB1Zd3GeqPucSE 这不是一个完整的答案,但应该能指导你朝正确的方向前进。 - Joel Coehoorn
4个回答

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

1

使用三角形连接:

在 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

0

这应该能帮到你。

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

您可以使用存储过程中的游标来实现此操作。然后,您可以逐步遍历帐户记录并累积积分。一旦您超过阈值,就返回当前记录。

但是,如果您有大量数据集,这可能会非常慢,因此,如果在运行查询之前知道您要达到的阈值,则可以添加一个额外的表,在其中标记您跨越所需阈值的记录。可以在交易表上的触发器中更新此额外的表。


无需在此处添加光标或额外的表格。 - Joel Coehoorn
我刚看到了你的帖子。不错! - Rune Grimstad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接