说在前面
🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
题目描述
表: Users
+--------------+---------+ | Column Name | Type | +--------------+---------+ | account | int | | name | varchar | +--------------+---------+ account 是该表的主键(具有唯一值的列)。 该表的每一行都包含银行中每个用户的帐号。 表中不会有两个用户具有相同的名称。
表: Transactions
+---------------+---------+ | Column Name | Type | +---------------+---------+ | trans_id | int | | account | int | | amount | int | | transacted_on | date | +---------------+---------+ trans_id 是该表主键(具有唯一值的列)。 该表的每一行包含了所有账户的交易改变情况。 如果用户收到了钱, 那么金额是正的; 如果用户转了钱, 那么金额是负的。 所有账户的起始余额为 0。
编写解决方案, 报告余额高于 10000 的所有用户的名字和余额. 账户的余额等于包含该账户的所有交易的总和。
返回结果表单 无顺序要求 。
查询结果格式如下例所示。
示例 1:
输入: Users table: +------------+--------------+ | account | name | +------------+--------------+ | 900001 | Alice | | 900002 | Bob | | 900003 | Charlie | +------------+--------------+ Transactions table: +------------+------------+------------+---------------+ | trans_id | account | amount | transacted_on | +------------+------------+------------+---------------+ | 1 | 900001 | 7000 | 2020-08-01 | | 2 | 900001 | 7000 | 2020-09-01 | | 3 | 900001 | -3000 | 2020-09-02 | | 4 | 900002 | 1000 | 2020-09-12 | | 5 | 900003 | 6000 | 2020-08-07 | | 6 | 900003 | 6000 | 2020-09-07 | | 7 | 900003 | -4000 | 2020-09-11 | +------------+------------+------------+---------------+ 输出: +------------+------------+ | name | balance | +------------+------------+ | Alice | 11000 | +------------+------------+ 解释: Alice 的余额为(7000 + 7000 - 3000) = 11000. Bob 的余额为1000. Charlie 的余额为(6000 + 6000 - 4000) = 8000.
解题思路
首先,我们使用左连接(left join)将Users表和Transactions表连接在一起。左连接保证了即使在Transactions表中没有与之匹配的记录时,仍然能够返回Users表中的所有记录。
接下来,我们以t.account为基准,将两个表中的数据进行分组(group by t.account)。这意味着我们将根据账户号码(account)将所有相关的交易记录分组在一起。
然后,我们使用having子句来筛选出满足条件的分组结果。在这种情况下,我们只保留满足sum(t.amount)>10000的分组。也就是说,我们只返回交易总额超过10000的账户。
最后,我们选择u.name和sum(t.amount)作为结果集。这意味着我们将返回账户名和对应的交易总额作为查询结果。
AC代码
select u.name,sum(t.amount)as balance from Users as u left join Transactions as t on u.account=t.account group by t.account having sum(t.amount)>10000
公众号
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。