1587. 银行账户概要 II

简介: 1587. 银行账户概要 II

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

表: 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
6月前
|
安全 API 开发者
转账到支付宝账户接口:一次开发,提升打款效率
转账到支付宝账户接口:一次开发,提升打款效率
134 0
支付系统03------支付指引,开启支付的前置条件,公户,如果是企业要准备营业执照,组织机构代码证,对公银行账户,法人身份证
支付系统03------支付指引,开启支付的前置条件,公户,如果是企业要准备营业执照,组织机构代码证,对公银行账户,法人身份证
|
6月前
银行,客户,账户
银行,客户,账户
42 0
银行,客户,账户
|
6月前
|
SQL
leetcode-SQL-1587. 银行账户概要 II
leetcode-SQL-1587. 银行账户概要 II
47 0
|
区块链
币安交易所的NFT资产充值和提现逻辑开发智能合约源代码详情
function rechargeNFT(uint256 amount) public returns (uint256 remainingAmount) { // 检查 NFT 资产合约是否有足够的数量供充值
|
存储 编译器 uml
银行账户类(Accoount)可以为账户存储交易。取款和存款都会产生交易信息。需要记录账户每次交易的信息,包括取钱还是存钱,交易的金额,交易时间和交易之后的余额。系统可以通过账户查询所有的交易次数(最
银行账户类(Accoount)可以为账户存储交易。取款和存款都会产生交易信息。需要记录账户每次交易的信息,包括取钱还是存钱,交易的金额,交易时间和交易之后的余额。系统可以通过账户查询所有的交易次数(最
226 0
|
存储 编译器 uml
创建一个银行账户的继承层次,表示银行的所有客户的账户。每个客户都能在他们的银行账户存钱,取钱。但是账户可以分为更具体的两种类型,例如,依靠存款生息的存储账户SavingsAccount类,另一种就是信
创建一个银行账户的继承层次,表示银行的所有客户的账户。每个客户都能在他们的银行账户存钱,取钱。但是账户可以分为更具体的两种类型,例如,依靠存款生息的存储账户SavingsAccount类,另一种就是信
181 0
C++编程练习:设计一个银行账户类,包含户名、帐号以及当前余额属性,并且能完成开户、存款、取款和查询余额等行为。
C++编程练习:设计一个银行账户类,包含户名、帐号以及当前余额属性,并且能完成开户、存款、取款和查询余额等行为。
C++编程练习:设计一个银行账户类,包含户名、帐号以及当前余额属性,并且能完成开户、存款、取款和查询余额等行为。
|
数据库
LeetCode(数据库)- 银行账户概要 II
LeetCode(数据库)- 银行账户概要 II
100 0
|
数据库
LeetCode(数据库)- 银行账户概要
LeetCode(数据库)- 银行账户概要
102 0