列表

详情


1843. 可疑银行账户

表: Accounts

+----------------+------+
| Column Name    | Type |
+----------------+------+
| account_id     | int  |
| max_income     | int  |
+----------------+------+
account_id 是这张表具有唯一值的列。
每行包含一个银行账户每月最大收入的信息。

 

表: Transactions

+----------------+----------+
| Column Name    | Type     |
+----------------+----------+
| transaction_id | int      |
| account_id     | int      |
| type           | ENUM     |
| amount         | int      |
| day            | datetime |
+----------------+----------+
transaction_id 是这张表具有唯一值的列。
每行包含一条转账信息。
type 是枚举类型(包含'Creditor','Debtor'),其中 'Creditor' 表示用户向其账户存入资金,'Debtor' 表示用户从其账户取出资金。
amount 是交易过程中的存入/取出的金额。

 

如果一个账户在 连续两个及以上 月份的 总收入 超过最大收入(max_income),那么认为这个账户 可疑。  账户当月 总收入 是当月存入资金总数(即 transactions 表中 type 字段的 'Creditor')。

编写一个解决方案,报告所有的 可疑 账户。

任意顺序 返回结果表

返回结果格式如下示例所示。

 

示例 1:

输入:
Accounts 表:
+------------+------------+
| account_id | max_income |
+------------+------------+
| 3          | 21000      |
| 4          | 10400      |
+------------+------------+
Transactions 表:
+----------------+------------+----------+--------+---------------------+
| transaction_id | account_id | type     | amount | day                 |
+----------------+------------+----------+--------+---------------------+
| 2              | 3          | Creditor | 107100 | 2021-06-02 11:38:14 |
| 4              | 4          | Creditor | 10400  | 2021-06-20 12:39:18 |
| 11             | 4          | Debtor   | 58800  | 2021-07-23 12:41:55 |
| 1              | 4          | Creditor | 49300  | 2021-05-03 16:11:04 |
| 15             | 3          | Debtor   | 75500  | 2021-05-23 14:40:20 |
| 10             | 3          | Creditor | 102100 | 2021-06-15 10:37:16 |
| 14             | 4          | Creditor | 56300  | 2021-07-21 12:12:25 |
| 19             | 4          | Debtor   | 101100 | 2021-05-09 15:21:49 |
| 8              | 3          | Creditor | 64900  | 2021-07-26 15:09:56 |
| 7              | 3          | Creditor | 90900  | 2021-06-14 11:23:07 |
+----------------+------------+----------+--------+---------------------+
输出:
+------------+
| account_id |
+------------+
| 3          |
+------------+
解释:
对于账户 3:
- 在 2021年6月,用户收入为 107100 + 102100 + 90900 = 300100。
- 在 2021年7月,用户收入为 64900。
可见收入连续两月超过21000的最大收入,因此账户3列入结果表中。

对于账户 4:
- 在 2021年5月,用户收入为 49300。
- 在 2021年6月,用户收入为 10400。
- 在 2021年7月,用户收入为 56300。
可见收入在5月与7月超过了最大收入,但6月没有。因为账户没有没有连续两月超过最大收入,账户4不列入结果表中。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

mysql 解法, 执行用时: 742 ms, 内存消耗: 0 B, 提交时间: 2023-10-16 16:50:38

with temp as (
  select
    account_id,
    date_format(day, '%Y%m') yearmonth
  from transactions join accounts using(account_id)
  where type = 'creditor'
  group by account_id, yearmonth
  having sum(amount) > max(max_income)
)
select
  distinct account_id 
from temp t1 join temp t2 using(account_id)
where t1.yearmonth = t2.yearmonth + 1;

-- where 可改成
-- period_diff(t1.yearmonth, t2.yearmonth) = 1

mysql 解法, 执行用时: 806 ms, 内存消耗: 0 B, 提交时间: 2023-10-16 16:50:03

with temp as (
  select 
    account_id,
    date_format(day, '%Y%m') yearmonth
  from transactions join accounts using(account_id)
  where type = 'creditor'
  group by account_id, yearmonth
  having sum(amount) > max(max_income)
)
select 
  distinct account_id 
from temp where (account_id, period_add(yearmonth, 1)) in (
  select account_id, yearmonth from temp
);

mysql 解法, 执行用时: 753 ms, 内存消耗: 0 B, 提交时间: 2023-10-16 16:49:26

# Write your MySQL query statement below
WITH base AS (
	SELECT account_id, DATE_FORMAT(day, '%Y%m') AS yearmonth
	FROM Transactions JOIN Accounts USING (account_id)
	WHERE type = 'Creditor'
	GROUP BY account_id, DATE_FORMAT(day, '%Y%m')
	HAVING SUM(amount) > AVG(max_income)
)
SELECT DISTINCT account_id
FROM base
WHERE (account_id, PERIOD_ADD(yearmonth, 1)) IN (
	SELECT account_id, yearmonth
	FROM base
)

上一题