我正在使用SQL,我有一个包含三个列的表:account,transaction_date,Points。 每个帐户都有多个transaction_dates和每笔交易获得的积分。
当每个帐户达到某个阈值(即累积100点)时,如何返回transaction_date。假设第一个帐户有2000个交易,前五个帐户有21个交易点。我希望查询返回事务#5,因为这是帐户达到100时。
有人可以帮忙吗? 谢谢! 猫
答案 0 :(得分: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 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
您可以使用存储过程中的游标执行此操作。然后,您可以单步浏览帐户的记录并累积积分。一旦超过阈值,就会返回当前记录。
但是如果您有一个大型数据集,这可能会非常慢,所以如果您知道在运行查询之前所遇到的阈值,您可以添加一个额外的表来标记您跨越阈值的记录之后。更新此额外表可以在事务表的触发器中完成。