首页 > 数据库 >LeetCode_sql_day07(579. 查询员工的累计薪水,2173.最多连胜的次数)

LeetCode_sql_day07(579. 查询员工的累计薪水,2173.最多连胜的次数)

时间:2024-07-28 17:57:49浏览次数:12  
标签:insert 579 player into day07 month 2173 values id

描述:579. 查询员工的累计薪水

编写一个解决方案,在一个统一的表中计算出每个员工的 累计工资汇总 
员工的 累计工资汇总 可以计算如下:
对于该员工工作的每个月,将 该月 和 前两个月 的工资 加 起来。这是他们当月的 3 个月总工资和 。如果员工在前几个月没有为公司工作,那么他们在前几个月的有效工资为 0 。
不要 在摘要中包括员工 最近一个月 的 3 个月总工资和。
不要 包括雇员 没有工作 的任何一个月的 3 个月总工资和。
返回按 id 升序排序 的结果表。如果 id 相等,请按 month 降序排序。

输出:

数据准备:

Create table If Not Exists Employee (id int, month int, salary int);
Truncate table Employee;
insert into Employee (id, month, salary) values ('1', '1', '20')
insert into Employee (id, month, salary) values ('2', '1', '20')
insert into Employee (id, month, salary) values ('1', '2', '30')
insert into Employee (id, month, salary) values ('2', '2', '30')
insert into Employee (id, month, salary) values ('3', '2', '40')
insert into Employee (id, month, salary) values ('1', '3', '40')
insert into Employee (id, month, salary) values ('3', '3', '60')
insert into Employee (id, month, salary) values ('1', '4', '60')
insert into Employee (id, month, salary) values ('3', '4', '70')
insert into Employee (id, month, salary) values ('1', '7', '90')
insert into Employee (id, month, salary) values ('1', '8', '90')

分析:

①简化表:先去掉最近一月的各员工薪资信息,可以考虑用row_number()开窗函数根据id分类month降序排序 

select *,
       row_number() over (partition by id order by month desc)r1
      from employee

②过滤数据 将上述三行筛选掉,再通过sum()开窗函数计算前两个月和该月工资,最后进行排序整理与题目要求一致(这里使用range不是rows)

with t1 as(
select *,
       row_number() over (partition by id order by month desc)r1
      from employee
       )
select id,
       month,
       sum(salary) over(partition by id order by month range 2 preceding )Salary
from t1
where r1 != 1
order by id,month desc

代码:

with t1 as(
select *,
       row_number() over (partition by id order by month desc)r1
      from employee
       )
select id,
       month,
       sum(salary) over(partition by id order by month range 2 preceding )Salary
from t1
where r1 != 1
order by id,month desc
;

总结:

range与rows的区别:

在本题的基础上再添加一条数据

insert into Employee (id, month, salary) values ('1', '5', '30')

如图:

range版


rows版

描述:2173.最多连胜的次数

计算每个参赛选手最多的连胜数

输出:

数据准备:

drop database if exists db_1;

create database db_1;

use db_1;

Create table If Not Exists Matches (player_id int, match_day date, result ENUM('Win', 'Draw', 'Lose'));

Truncate table Matches;

insert into Matches (player_id, match_day, result) values ('1', '2022-01-17', 'Win');

insert into Matches (player_id, match_day, result) values ('1', '2022-01-18', 'Win');

insert into Matches (player_id, match_day, result) values ('1', '2022-01-25', 'Win');

insert into Matches (player_id, match_day, result) values ('1', '2022-01-31', 'Draw');

insert into Matches (player_id, match_day, result) values ('1', '2022-02-08', 'Win');

insert into Matches (player_id, match_day, result) values ('2', '2022-02-06', 'Lose');

insert into Matches (player_id, match_day, result) values ('2', '2022-02-08', 'Lose');

insert into Matches (player_id, match_day, result) values ('3', '2022-03-30', 'Win');

分析:

①对题目分析,如何判断是连胜,此处需要用到两个row_number()做差得到的结果

with t1 as(
select *,row_number() over(partition by player_id order by match_day)r1 from Matches)
,t2 as (
select *,row_number() over (partition by player_id order by match_day)r2 from t1 where result = 'Win')
select *,(r1-r2) r3 from t2

②观察上表就可以根据player_id 和r3进行分组,用count求出各参赛选手连胜场次

select player_id,count(r3)con from t3
group by player_id,r3

③max求各参赛选手最大连胜次数,同时右连接(select distinct player_id from Matches)表(该表有所有选手信息),完善代码,如果max为null那么记为0

select t5.player_id,ifnull(max(con),0)longest_streak from t4 right join (select distinct player_id from Matches)t5
on t5.player_id=t4.player_id
group by player_id

代码:

with t1 as (select *, row_number() over (partition by player_id order by match_day) r1 from Matches)
   , t2 as (select *, (r1 - row_number() over (partition by player_id order by match_day)) r3
            from t1
            where result = 'Win')
   , t3 as (select player_id, count(r3) con
            from t2
            group by player_id, r3)
select t5.player_id, ifnull(max(con), 0) longest_streak
from t3
         right join (select distinct player_id from Matches) t5
                    on t5.player_id = t3.player_id
group by player_id;

总结:

如何判断连胜是关键:根据一个不加条件的row_number() 和一个加了过滤Win的row_number()做差得出的结果进行分类

标签:insert,579,player,into,day07,month,2173,values,id
From: https://blog.csdn.net/weixin_54353942/article/details/140718883

相关文章

  • day0722~day0726Java基础
    目录异常编译异常(受检异常)  运行异常(非受检异常)异常处理捕获异常:try…catch try...catch支持多分支catch语句书写try...catch...finally语句 throws/throw关键字 自定义异常 线程线程调度线程的优先级创建线程1.Thread类线程类2.Runnable......
  • Day07 MySQL 面试题 (三)
    MySQL面试题22、MySQL里记录货币用什么字段类型好NUMERIC和DECIMAL类型被MySQL实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。例......
  • zyx青岛实训day07 7/16 (yum仓库)
    一,复习高级指令find-name按名称搜索,支持通配符-typed|f-sizeKMG+3M,-3M,3Mddif=/dev/zeroof=文件路径bs=300Mcount=1-mtime+3-3touch文件名-m-d"最后修改时间"-execrm-rf{}\;find/-size+3M|xargsrm-rftreeyum-yinstalltree——将文......
  • javaSE学习 day07
    目录1.final关键字1.1final是什么1.2final修饰类1.3final修饰方法1.4final修饰变量1.5使用final需要注意什么2.单例设计模式2.1是什么2.2作用2.3饿汉单例2.4懒汉单例3.枚举3.1是什么3.2可以表达什么3.3定义格式3.4特点3.5使用场景4.抽象类4.1什么是抽象类......
  • 云计算day07
    一、yum源概述软件包管理器,类似于360软件管家,以及⼿机的app市场yum优点Rpm安装(下载软件,单独安装,需要解决依赖关系)源码安装confguremakemakeinstallyum基于rpm,相当于rpm升级版,⾃动解决依赖关系分类:本地yum源yum仓库在本地,系统光盘/镜像⽂件⽹......
  • Day07 yum
    yum源查看现有的yum仓库镜像[root@localhost~]#ls-l/etc/yum.repos.d/总用量4-rw-r--r--.1rootroot437月 811:04hh.repo打包保存 做成一个tar.gzyumrepolistalltar-zcvf /etc/yum.repos.d/bak.tar.gz /etc/yum.repos.d/*rm-rf/etc/yum.repos......
  • day07-SpringBoot
    昨日回顾SSM框架的问题配置文件多。所有的都需要手动配置依赖多。而且会出现版本问题。例如json包就出现版本不兼容问题。启动需要借助tomcat。还要手动集成tomcat插件。学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于Sprin......
  • 嵌入式开发学习day07
    1、提示并输入一个字符串,统计该字符串中字母、数字、空格以及其他字符的个数#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){chararr[20]={0};intlen;intzm=0,sz=0,kg=0,other=0;printf("请输入字符串\n");gets......
  • cas:444579-39-9、4,7-双(5-溴-4-己基噻吩-2-基)苯并[c][1,2,5]噻二唑
    中文名称:4,7-双(5-溴-4-己基噻吩-2-基)苯并[c][1,2,5]噻二唑英文名称:4,7-Bis(5-bromo-4-hexylthiophen-2-yl)benzo[c][1,2,5]thiadiazoleCAS号:444579-39-9纯度:95%+用途:仅用于科研,不能用于人体分子式C26H30Br2N2S3分子量626.53300储存条件室温,干燥cas:1415929-78-0......
  • m2_day07 [File]
    课程内容:File类概述File类一等优先级方法今日小结File类概述相对路径和绝对路径绝对路径:从盘符或者根目录出发定位我们要的文件相对路径:相对于程序认定的主目录出发定位我们要的文件构造方法newFile(String路径)newFile(String父目录,String文件名......