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
相关推荐
天选之女wow几秒前
【代码随想录算法训练营——Day31】贪心算法——56.合并区间、738.单调递增的数字、968.监控二叉树
算法·leetcode·贪心算法
lixinnnn.4 分钟前
贪心:火烧赤壁
数据结构·c++·算法
小小前端_我自坚强7 分钟前
前端算法相关详解
前端·算法
GanGuaGua41 分钟前
MySQL:表的约束
数据库·mysql
前端 贾公子42 分钟前
《Vuejs设计与实现》第 5 章(非原始值响应式方案)下 Set 和 Map 的响应式代理
数据结构·算法
Li zlun2 小时前
MySQL 性能监控与安全管理完全指南
数据库·mysql·安全
WWZZ20252 小时前
ORB_SLAM2原理及代码解析:SetPose() 函数
人工智能·opencv·算法·计算机视觉·机器人·自动驾驶
养生技术人2 小时前
Oracle OCP认证考试题目详解082系列第48题
运维·数据库·sql·oracle·database·开闭原则·ocp
小马学嵌入式~2 小时前
堆排序原理与实现详解
开发语言·数据结构·学习·算法
青岛少儿编程-王老师3 小时前
CCF编程能力等级认证GESP—C++6级—20250927
java·c++·算法