货币到期跟踪
问题描述:
我现在正在用货币到期追踪问题(原来它不是金钱,但我用它作为一个更方便的例子)。货币到期跟踪
用户可以通过某个神秘的原因从平台上赚钱,并花费他们购买东西(产品,礼品等)。
我正在查找算法(SQL查询最好的情况)来查找用户余额的当前余额。
支出和赚钱的事件存储不同的数据库(MySQL的)表(假设user_earned
和user_spent
)。因此,在正常情况下,我只需计算用户总数user_earned
并减去所花费的金额(总计user_spent
)。
但是!有一个条件,即赢得的用户资金在2年内到期如果他们不使用。 这意味着,如果用户没有使用他的资金或仅使用其中的一部分,他们将会过期。如果用户使用他的钱,他们从使用最早的未过期的货币记录,所以余额(奖金)可以计算在用户的青睐。
这是5分的情况在时间的事件,有对此案进行更好的理解:
两个表(user_earned
和user_spent
)已时间戳日期跟踪。
答
我在我的一个项目中做了类似的事情。
看起来像你需要一个额外的表spends_covering
与列 spend_id
,earhed_id
,sum
所以每个spends
记录你需要插入一个或多个行到spends_covering
,以纪念“拿来主义”的钱。
然后余额将只是日期少于2年时未使用的总和。
select sum(sub.earned_sum-sub.spent_sum) as balance
from
(select e.sum as earned_sum, sum(sc.sum) as spent_sum
from earned e
left join spends_covering sc on e.earhed_id=sc.earhed_id
where e.date BETWEEN ...
group by e.earhed_id
having earned_sum > spent_sum) sub
答
它可能是值得的有两个表 - 一个(或多个)与所有的历史细节,只有当前余额为每个'用户'。一定要使用交易来保持两者同步。
这可能是一个最好在应用程序代码中完成的任务。 –
目前,我已经实施了一项服务,通过简单地建立事件列表(接收,使用,到期)并逐个运行它们来计算余额。它的工作原理,但如果我需要在SQL查询中取得平衡以获得积极的平衡,我必须在数据库之前将该值非规格化。 – Aistis