SQL实战训练之,力扣:1843. 可疑银行账户

news2024/11/7 21:00:04

目录

        一、力扣原题链接

        二、题目描述

        三、建表语句

        四、题目分析        

        五、SQL解答

        六、最终答案

        七、验证

        八、知识点


一、力扣原题链接

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

三、建表语句

drop table if exists Accounts;
drop table if exists Transactions;
Create table If Not Exists Accounts (account_id int, max_income int);
Create table If Not Exists Transactions (transaction_id int, account_id int, type ENUM('creditor', 'debtor'), amount int, day datetime);
Truncate table Accounts;
insert into Accounts (account_id, max_income) values ('3', '21000');
insert into Accounts (account_id, max_income) values ('4', '10400');
Truncate table Transactions;
insert into Transactions (transaction_id, account_id, type, amount, day) values ('2', '3', 'Creditor', '107100', '2021-06-02 11:38:14');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('4', '4', 'Creditor', '10400', '2021-06-20 12:39:18');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('11', '4', 'Debtor', '58800', '2021-07-23 12:41:55');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('1', '4', 'Creditor', '49300', '2021-05-03 16:11:04');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('15', '3', 'Debtor', '75500', '2021-05-23 14:40:20');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('10', '3', 'Creditor', '102100', '2021-06-15 10:37:16');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('14', '4', 'Creditor', '56300', '2021-07-21 12:12:25');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('19', '4', 'Debtor', '101100', '2021-05-09 15:21:49');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('8', '3', 'Creditor', '64900', '2021-07-26 15:09:56');
insert into Transactions (transaction_id, account_id, type, amount, day) values ('7', '3', 'Creditor', '90900', '2021-06-14 11:23:07');

四、题目分析

需求:

        连续两个及以上 月份的 总收入 超过最大收入(max_income),那么认为这个账户 可疑

解答:

        1、要求每月总收入需要先按月统计所有的收入总和

        2、筛选每月大于最大收入的用户

        3、用等差求连续月

        4、筛选连续大于2月的用户

五、SQL解答

with t1 as (
    select
        DATE_FORMAT(day,'%Y-%m') ny,
        substring(day,1,7) ny1,
        account_id,
        -- 1、每月收入总和
        sum(amount) sum_amount,
        dense_rank() over (partition by account_id order by DATE_FORMAT(day,'%Y-%m')) dr
    from transactions t
    where type = 'Creditor'
    group by ny,ny1,account_id
    -- 2、筛选每月大于最大收入
    having sum_amount > (select max_income from accounts where account_id = t.account_id)
),t2 as (
select
    account_id,
    -- 3、日期等差求连续
    date_add(str_to_date(concat(ny,'-01'),'%Y-%m-%d'),interval -dr month) as day2
from t1
group by day2,account_id
-- 4、最少连续2天
having count(date_add(str_to_date(concat(ny,'-01'),'%Y-%m-%d'),interval -dr month)) >= 2
)
select distinct account_id from t2
;

六、最终答案

with t1 as (
    select
        DATE_FORMAT(day,'%Y-%m') ny,
        substring(day,1,7) ny1,
        account_id,
        -- 1、每月收入总和
        sum(amount) sum_amount,
        dense_rank() over (partition by account_id order by DATE_FORMAT(day,'%Y-%m')) dr
    from transactions t
    where type = 'Creditor'
    group by ny,ny1,account_id
    -- 2、筛选每月大于最大收入
    having sum_amount > (select max_income from accounts where account_id = t.account_id)
),t2 as (
select
    account_id,
    -- 3、日期等差求连续
    date_add(str_to_date(concat(ny,'-01'),'%Y-%m-%d'),interval -dr month) as day2
from t1
group by day2,account_id
-- 4、最少连续2天
having count(date_add(str_to_date(concat(ny,'-01'),'%Y-%m-%d'),interval -dr month)) >= 2
)
select distinct account_id from t2
;

七、验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件系统交付阶段必备文档,验收体系配套资料,软件系统各阶段各步骤相关配套资料,各类软件建设方案(word,ppt)

软件文档交付清单是指在软件开发项目完成后,开发团队需要准备的一份详细清单,用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单:工作安排任务书&…

Day07爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? class Solution {public int climbStairs(int n) {if (n 1) return 1;if (n 2) return 2;return climbStairs(n - 1) climbStairs(n - 2);} }用…

【51单片机】串口通信原理 + 使用

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 结束语 串口 串口是一种应用十分广泛…

c盘满了怎么清理垃圾而不误删?6招轻松清理C盘,快来试试

c盘满了怎么清理垃圾而不误删?相信平时工作生活中离不开电脑,随着使用电脑时间就了,C 盘的空间会不断被占据,进而致使系统运行变得迟缓,甚至出现卡顿现象。因此,定期清理 C 盘的是非常重要的。很多电脑小白…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…

MATLAB中pinv函数用法

目录 语法 说明 示例 使用伪逆求解线性方程组 pinv的功能是得到矩阵的Moore-Penrose 伪逆。 语法 B pinv(A) B pinv(A,tol) 说明 B pinv(A) 返回矩阵 A 的 Moore-Penrose 伪逆。 B pinv(A,tol) 指定容差的值。pinv 将 A 中小于容差的奇异值视为零。 示例 使用伪逆…

DP31 买卖股票的最好时机(二)

DP31 买卖股票的最好时机(二) import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();int [] p new int[n];int sum 0;for…

.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题

一、接口传参实现 1、引入:通过网址上两个参数mod...和FID....,区分开要的是哪个板块里面的数据​​​​​ 2、传参实现:在方法的参数处定义STRING字符串 (1)传1个参数 2>运行代码,在网页上输入以“点…

为什么一定要学AI(Stable Diffusion)做设计?

在当今数字化时代,人工智能技术正在以前所未有的速度和规模改变着各行各业的工作方式和流程。 更多实操教程可以扫描下方,免费获取 而室内设计领域中,AI技术也正在迅速崛起,为设计师们带来了前所未有的便利和创作可能性&#xff0…

mysql密码过期问题处理

链接mysql报错 Your password has expired. To log in you must change it using a client that supports expired passwords; 1、打开mysql链接工具 LINUV bin目录 windows 打开mysql client 2、进入mysql命令框 输入旧密码 3、执行 mysql> set passwordpassword(12345…

灵动AI视频 —— 创意无界,视频新生

在这个瞬息万变的数字时代,每一帧画面都蕴含着无限可能。灵动AI视频,作为一款集智能、高效、创意于一体的视频编辑神器,正引领着视频创作的新潮流。 灵动ai视频用户端:灵动 AI-新一代AI创意生产力平台​编辑https://one.genceai.…

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】 🌐 在现代前端开发中,单页面应用(SPA)以及不同的架构模式(如MVC和MVVM)是实现用户交互的关键概念。了解它们的优缺点以及如何应用&a…

Vue3+TypeScript+Vite 后台管理项目

一、前言 我将使用当前最新版本完成项目搭建,我会尽量将每个操作细节记录下来,并且解释原因,标明依据出处,这样即使大家脱离当前这个版本,跟着文章依然可以完成项目搭建,这篇文章也依然有他的价值&#xf…

知识竞赛活动用什么样的话筒或麦克风好呢

搞知识竞赛活动,话筒一般是需要的,从选手到主持人、评委甚至有些观众,每场活动用量不少。 市场上的麦克风五花八门,从价格低廉的入门款到高端专业设备,不胜枚举。这让很多用户在选择时感到无从下手。如何在众多产品中…

面向对象编程中类与类之间的关系(二)

目录 1.引言 2.泛化(继承)关系 3.实现关系 4.聚合关系 5.组合关系 6.依赖关系 7.关联关系 7.1. 单向关联 7.2. 双向关联 7.3.自关联 8.总结 1.引言 在面向对象设计模式中,类与类之间主要有6种关系,他们分别是&#xff…

贪心算法入门(一)

1.什么是贪心算法? 贪心算法是一种解决问题的策略,它将复杂的问题分解为若干个步骤,并在每一步都选择当前最优的解决方案,最终希望能得到全局最优解。这种策略的核心在于“最优”二字,意味着我们追求的是以最少的时间和…

MATLAB发票识别系统

课题介绍 该课题为基于MATLAB的发票识别系统。主要识别发票的编号。可定做发票的日期,金额等字段的识别。通过输入图片,校正,定位目标区域,分割,字符分割,模板匹配识别,得出结果。整个设计包含…

spark==windows启动spark集群

下载hadoop3.0.0 https://archive.apache.org/dist/hadoop/core/hadoop-3.0.0/ 下载spark3.5.3 Index of /dist/spark/spark-3.5.0 添加环境变量 HADOOP_HOME SPARK_HOME PATH中添加%HADOOP_HOME%\bin,%HADOOP_HOME%\sbin, %SPARK_HOME%\bin,%SPARK_HOME%\sbin, 启动mast…

(实战)WebApi第10讲:Swagger配置、RESTful与路由重载

一、Swagger配置 1、导入SwashBuckle.AspNetCore包 2、在.NET Core 5框架里的startup.cs文件里配置swagger 3、在.NET Core 6框架里的Program.cs文件里配置swagger 二、RESTful风格:路由重载,HttpGet()括号中加参数 (1)原则&…

【春秋云镜】CVE-2023-27179

CVE-2023-27179 CVE-2023-27179 是一个影响 Apache Doris 的漏洞。Apache Doris 是一款用于交互式分析的高性能数据库,特别适用于处理大规模的结构化数据。该漏洞属于权限提升漏洞,允许未授权用户以管理员身份执行敏感操作。 具体细节 漏洞类型&#…