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
相关推荐
我来整一篇5 分钟前
用Redis的List实现消息队列
数据库·redis·list
fancy16616614 分钟前
力扣top100 矩阵置零
人工智能·算法·矩阵
小南家的青蛙21 分钟前
LeetCode面试题 01.09 字符串轮转
java·leetcode
加什么瓦26 分钟前
Redis——数据结构
数据库·redis·缓存
神仙别闹26 分钟前
基于C#+SQL Server开发(WinForm)租房管理系统
数据库·oracle·c#
元亓亓亓43 分钟前
LeetCode热题100--240.搜索二维矩阵--中等
算法·leetcode·矩阵
528301 小时前
MySQL主从复制
数据库·mysql
qq_12498707531 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
jie188945758661 小时前
ubuntu----100,常用命令2
数据库·ubuntu
若兰幽竹2 小时前
【HBase整合Hive】HBase-1.4.8整合Hive-2.3.3过程
数据库·hive·hbase