LeetCode-579、查询员工的累计薪水,601、体育馆的人流量 为啥不推荐uuid作为Mysql的主键呢 手把手教学:linux下oracle升级至11.2.0.4 数据库专题——深入理解count(*)为什么这么慢 Linux中MySQL数据库的使用④-----常用查询语句、常用函数 mysql备份与恢复:完全备份,增量备份,基于位置点恢复,基于时间点恢复 MySQL数据库的编译安装过程 《MySQL 入门教程》第 28 篇 字符集与排序规则 PHP面试技巧 之 职场暗语知多少?! [Dubox]实测。还是原来的配方,还是一样的味道! 【剑指金九银十】程序员,如何做到不惑?(附四面拿到字节跳动offer全过程) 超厉害的阿里技术读物,1500页超全计算机系统底层解析宝典 【融中财经早报9.16】大数据杀熟行为10月1日起明令禁止 大数据时代,机器学习算法该如何升级? 怎么判断自己是否适合做程序员 一分钟告诉你什么是区块链 一个时代一个机会,DeFi的起点X-DeFi,如何玩转X-DeFi? RTX3080显卡已被用于挖矿!映众辟谣:工程师测试散热 2020-09-15 比特币相当于房地产,怎样利用比特币获得流动现金? 区块链安全事件与代码审计 fisco bcos solidity销毁合约,删除合约的方法 Linux 中 Golang 的安装和环境配置 Golang interface{} 转换为某个结构体 区块链知识系列 - Raft 共识 OpenHarmony开发者文档开源计划,快快加入吧 融合创新提升服务,大数据搭建信息网 长三角税收一体化按下“快进键” 河钢集团与海尔集团签署物联网生态战略合作协议 1一个拥有万物互联神话,让我们看物联网是如何蓬勃发展的? 重庆大数据产业研究院成立,首批专家服务团名单公布 百分点大数据技术团队:互联网舆情系统的架构实践 水泥大数据研究院郑建辉:四季度水泥价格仍有望冲击去年高位 中国物联网与绿色智慧城市发展论坛召开 欧普照明点亮智慧道路之光 Android & Kotlin:Retrofit + Hilt 实现 看妹子app Android - 控件抖动效果 DevEco studio 一直加载gradle android如何获取调试版及发布版安全码SHA1 Android手机获取IP地址的两种方法 Android Activity 启动过程详解(上) 思维破局:挣钱其实没那么难,关键是方式要对 大数据赋能全产业链 为市民提供“一杯好奶” 运用大数据实现节能减排精准化 2020最新拼多多Java面试版,五面拿到28K的Offer 中国电信(安徽)大数据产业园落户南岗科技园 打造华东区域云计算领头羊 深度解读!阿里腾讯滴滴字节首选,新一代大数据引擎Flink厉害在哪?附学习礼包 网络编程5:socket服务端和客户端代码实现 微信小程序 蓝牙重连异常 errCode:10004,errMsg:notifyBLECharacteristicValueChange:fail setNot 蓝桥杯--第八届省赛试题-电子钟程序设计 【TCP回声服务器】一篇文章帮助你看懂TCP! 关于国标GB28181流媒体协议视频平台EasyGBS设备无法接入平台的问题排查
您的位置:首页 >前端 >

LeetCode-579、查询员工的累计薪水,601、体育馆的人流量

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problemset/database/

文章目录

SQL结构:579. 查询员工的累计薪水(困难)解法一 SQL结构:601. 体育馆的人流量(困难)解法一

SQL结构:

Create table If Not Exists Employee (Id int, Month int, Salary int)Truncate table Employeeinsert 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')

579. 查询员工的累计薪水(困难)

Employee 表保存了一年内的薪水信息。

需求:请你编写 SQL 语句,对于每个员工,查询他除最近一个月(即最大月)之外,剩下每个月的近三个月的累计薪水(不足三个月也要计算)。

结果请按 Id 升序,然后按 Month 降序显示。

示例:输入:| Id | Month | Salary ||----|-------|--------|| 1| 1 | 20 || 2| 1 | 20 || 1| 2 | 30 || 2| 2 | 30 || 3| 2 | 40 || 1| 3 | 40 || 3| 3 | 60 || 1| 4 | 60 || 3| 4 | 70 |输出:| Id | Month | Salary ||----|-------|--------|| 1| 3 | 90 || 1| 2 | 50 || 1| 1 | 20 || 2| 1 | 20 || 3| 3 | 100|| 3| 2 | 40 |

解释:

员工 ‘1’ 除去最近一个月(月份 ‘4’),有三个月的薪水记录:月份 ‘3’ 薪水为 40,月份 ‘2’ 薪水为 30,月份 ‘1’ 薪水为 20。

所以近 3 个月的薪水累计分别为 (40 + 30 + 20) = 90,(30 + 20) = 50 和 20。

| Id | Month | Salary ||----|-------|--------|| 1| 3 | 90 || 1| 2 | 50 || 1| 1 | 20 |

员工 ‘2’ 除去最近的一个月(月份 ‘2’)的话,只有月份 ‘1’ 这一个月的薪水记录。

| Id | Month | Salary ||----|-------|--------|| 2| 1 | 20 |

员工 ‘3’ 除去最近一个月(月份 ‘4’)后有两个月,分别为:月份 ‘4’ 薪水为 60 和 月份 ‘2’ 薪水为 40。所以各月的累计情况如下:

| Id | Month | Salary ||----|-------|--------|| 3| 3 | 100|| 3| 2 | 40 |

解法一

-- 先用开窗lead(),取后一个月份,取不到补0,为了过滤最大月份,即值为0的为最大月份-- 再用开窗sum(),直接求近三个月的和,所以需要用到rows between来确定范围,即(上两条 到 当前行)-- 最后用id、月份desc排序SELECTId,Month,SUM(Salary) OVER (PARTITION BY Id ORDER BY Month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) SalaryFROM(SELECTId,Month,Salary,LEAD(Month, 1, 0) OVER (PARTITION BY Id ORDER BY Month) lmFROMEmployee) t1WHERE lm != 0ORDER BY Id, Month DESC

----------------------------华丽的分割线--------------------------------

SQL结构:

Create table If Not Exists stadium (id int, visit_date DATE NULL, people int);Truncate table stadium;insert into stadium (id, visit_date, people) values ('1', '2017-01-01', '10');insert into stadium (id, visit_date, people) values ('2', '2017-01-02', '109');insert into stadium (id, visit_date, people) values ('3', '2017-01-03', '150');insert into stadium (id, visit_date, people) values ('4', '2017-01-04', '99');insert into stadium (id, visit_date, people) values ('5', '2017-01-05', '145');insert into stadium (id, visit_date, people) values ('6', '2017-01-06', '1455');insert into stadium (id, visit_date, people) values ('7', '2017-01-07', '199');insert into stadium (id, visit_date, people) values ('8', '2017-01-08', '188');

601. 体育馆的人流量(困难)

X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)日期 (visit_date)人流量 (people)

需求:请编写一个查询语句,找出人流量的高峰期。高峰期时,至少连续三行记录中的人流量不少于100。

例如,表 stadium:+------+------------+-----------+| id | visit_date | people|+------+------------+-----------+| 1| 2017-01-01 | 10|| 2| 2017-01-02 | 109 || 3| 2017-01-03 | 150 || 4| 2017-01-04 | 99|| 5| 2017-01-05 | 145 || 6| 2017-01-06 | 1455|| 7| 2017-01-07 | 199 || 8| 2017-01-08 | 188 |+------+------------+-----------+对于上面的示例数据,输出为:+------+------------+-----------+| id | visit_date | people|+------+------------+-----------+| 5| 2017-01-05 | 145 || 6| 2017-01-06 | 1455|| 7| 2017-01-07 | 199 || 8| 2017-01-08 | 188 |+------+------------+-----------+

提示:

每天只有一行记录,日期随着 id 的增加而增加。体育馆并不是每天都开放的,所以记录中的日期可能会出现断层。

解法一

思路:连续N天,只要是连续的,都可以用等差的思想; 即(用某个连续字段 - 行号/排行 ),若是连续的,差值一定相同,再统计相同差值的个数即可。-- 先过滤出人流程量>=100的记录,然后再用id - 行号,得出差值(因为id是连续的)-- 再统计出,差值相同的个数,即个数多少,就连续多少。-- 最后根据条件 where 连续个数>=3 的记录即可。SELECTid,visit_date,peopleFROM(SELECTid,visit_date,people,COUNT(*) OVER (PARTITION BY diff_value) AS diff_value_numberFROM(SELECTid,visit_date,people,id - (ROW_NUMBER() OVER (ORDER BY id)) AS diff_valueFROMstadiumWHEREpeople >= 100) AS t1) AS t2WHEREt2.diff_value_number >= 3

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。