当总和达到某个阈值时如何返回记录

Posted

技术标签:

【中文标题】当总和达到某个阈值时如何返回记录【英文标题】:How to return a record when the sum reached a certain threshold 【发布时间】:2009-02-04 20:08:32 【问题描述】:

我正在使用 SQL,并且我有一个包含三个列的表:帐户、交易日期、积分。 每个帐户将有多个 transaction_dates 和每次交易赚取的积分。

当每个账户达到某个阈值(即累积 100 点)时,我如何返回 transaction_date。假设第一个账户有 2000 笔交易,前五个账户各有 21 点。我希望查询返回交易 #5,因为那是帐户达到 100 的时候。

有人可以帮忙吗? 谢谢! 猫

【问题讨论】:

什么 DBMS? mysql? SQL 服务器?甲骨文?等 您的意思是这些是在特定日期获得的积分吗?所以 11111 会在 2007 年 8 月 14 日(27+23+59 > 100)超过 100 分阈值,对吗? SQL Server 是的,你是对的。 27+23+59 >100 - 我需要返回 59 点的日期 看到这个问题:***.com/questions/287333/sql-select-until>这不是一个完整的答案,但应该指出你正确的方向。 【参考方案1】:
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

【讨论】:

【参考方案2】:

使用三角连接:

在 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

【讨论】:

【参考方案3】:

这应该会让你得到你想要的。

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

【讨论】:

【参考方案4】:

您可以在存储过程中使用游标来执行此操作。然后,您可以逐步浏览该帐户的记录并累积积分。一旦您通过阈值,您就会返回当前记录。

但是如果你有一个大数据集,这可能会很慢,所以如果你在运行查询之前知道你所追求的阈值,你可以添加一个额外的表,在其中标记你跨越阈值的记录是后。更新这个额外的表可以在事务表的触发器中完成。

【讨论】:

这里不需要光标或额外的表格。 我刚看到你的帖子。不错!

以上是关于当总和达到某个阈值时如何返回记录的主要内容,如果未能解决你的问题,请参考以下文章

如何获取单个整数/浮点列的总和达到某个值的行

SQL:当某些月份没有记录时,如何查询每月总和的平均值?

根据组和最大总和分配组

如何从JTextArea中删除旧文本,以便文档大小不超过阈值? (JAVA)

Pandas:一旦列达到另一列的某个值,我如何返回行值?

如何每 5 秒或当用户移动阈值而不耗尽电池时获得高精度位置?