leetcode 1843 可疑银行账户(postgresql)

需求

表: 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 是转账的存取金额。

写一个SQL查询语句列示所有的可疑账户。

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

返回的结果表以transaction_id 排序。

查询结果格式如下。

示例 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不列入结果表中。

输入

输出

sql 复制代码
with t1 as (
-- 筛选出需要的数据
select account_id,amount,to_char(day,'YYYY') as day_year,to_char(day,'mm') as day_month
from transactions
where type='creditor'
),t2 as (
-- 计算每个账户每月的收入数据
select account_id,day_year,day_month,sum(amount) as amount
from t1
group by account_id,day_year,day_month
),t3 as (
-- 添加一列,根据账户分组,年月排序,并求出大于最大值的数据
select t2.*,a.max_income,
       row_number() over (partition by a.account_id order by day_month,day_month) as rn1
from t2,accounts a
where t2.account_id=a.account_id and t2.amount>max_income
),t4 as (
-- 将月份减去新添加的一列,得到的数据相同的,为相邻的月份
select *,day_month::bigint-rn1 as rn2
from t3
)
-- 聚合求出所要的id
select account_id
from t4
group by account_id,day_year,rn2
having count(1)>1
order by account_id
相关推荐
小毅&Nora3 分钟前
【后端】【Redis】② Redis事务管理全解:从“购物车结算“到“银行转账“,一文彻底掌握事务机制
数据库·redis·事务
Σίσυφος190028 分钟前
霍夫变换vs LS vs RANSAC 拟合直线 MATLAB实现
算法·计算机视觉·matlab
假女吖☌42 分钟前
限流算法-redis实现与java实现
java·redis·算法
u01092727143 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
蒟蒻的贤1 小时前
两数之和。
算法
wen__xvn1 小时前
代码随想录算法训练营DAY27第八章 贪心算法 part01
算法·贪心算法
We་ct1 小时前
LeetCode 125. 验证回文串:双指针解法全解析与优化
前端·算法·leetcode·typescript
客卿1231 小时前
力扣20-有效括号(多家面试题)
算法·leetcode·职场和发展
木井巳1 小时前
【递归算法】快速幂解决 pow(x,n)
java·算法·leetcode·深度优先
玄同7652 小时前
深入理解 SQLAlchemy 的 relationship:让 ORM 关联像 Python 对象一样简单
人工智能·python·sql·conda·fastapi·pip·sqlalchemy