当总和达到某个阈值时如何返回记录
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 < t1.transaction_date) <= 100 GROUP BY account_id
【讨论】:
【参考方案4】:您可以在存储过程中使用游标来执行此操作。然后,您可以逐步浏览该帐户的记录并累积积分。一旦您通过阈值,您就会返回当前记录。
但是如果你有一个大数据集,这可能会很慢,所以如果你在运行查询之前知道你所追求的阈值,你可以添加一个额外的表,在其中标记你跨越阈值的记录是后。更新这个额外的表可以在事务表的触发器中完成。
【讨论】:
这里不需要光标或额外的表格。 我刚看到你的帖子。不错!以上是关于当总和达到某个阈值时如何返回记录的主要内容,如果未能解决你的问题,请参考以下文章