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
相关推荐
SKYDROID云卓小助手8 分钟前
无人设备遥控器之自动调整编码技术篇
人工智能·嵌入式硬件·算法·自动化·信号处理
ysa05103027 分钟前
数论基础知识和模板
数据结构·c++·笔记·算法
GEEK零零七40 分钟前
Leetcode 1103. 分糖果 II
数学·算法·leetcode·等差数列
祁思妙想41 分钟前
八股学习(三)---MySQL
数据库·学习·mysql
今天背单词了吗9801 小时前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
惊骇世俗王某人1 小时前
1.MySQL之如何定位慢查询
数据库·mysql
程序员张31 小时前
SQL分析与打印-p6spy组件
spring boot·sql·mybatis·mybatisplus·p6spy
秦歌6662 小时前
向量数据库-Milvus快速入门
数据库·milvus
重庆小透明2 小时前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
desssq2 小时前
力扣:70. 爬楼梯
算法·leetcode·职场和发展