SQL力扣练习(六)

这篇具有很好参考价值的文章主要介绍了SQL力扣练习(六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 部门工资前三高的所有员工(185)

题解一(dense_rank()窗口函数)

题解二(自定义函数)

 2.删除重复的电子邮箱(196)

题解一

题解二(官方解析)

3.上升的温度(197)

解法一(DATEDIFF())

解法二(TIMESTAMPDIFF())

解法三(ADDDATE()力扣)


1. 部门工资前三高的所有员工(185)

表: Employee

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
Id是该表的主键列。
departmentId是Department表中ID的外键。
该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。

表: Department

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
Id是该表的主键列。
该表的每一行表示部门ID和部门名。

公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。

编写一个SQL查询,找出每个部门中 收入高的员工 。

以 任意顺序 返回结果表。

题解一(dense_rank()窗口函数)

dense_rank() 排序规则 1 2 3 3  4

rank() 1 2  3 3 5

partition by 根据某字段分区

# Write your MySQL query statement below
select  Department, Employee, Salary 
from (select d.name Department,e.name Employee,e.salary Salary ,dense_rank() over(partition by d.name order by e.salary desc) no from employee e join department d
on e.departmentId=d.id) temp
where temp.no<=3

题解二(自定义函数)

到现在,我对这个自定义函数的用法才稍微熟练了一点,这自定义函数的出现,可以让sql变的更加灵活。

CASE 
         WHEN @pre = DepartmentId THEN @rank:= @rank + 1
         WHEN @pre := DepartmentId THEN @rank:= 1
END AS 'RANK'

这个意思是,如果@pre等于当前的DepartmentId则@rank加一,否则更新@pre的值且@rank=1。

这个@rank的值命名为RANK字段。用这个进行排序的关键就是from 的表需要有序。

SELECT dep.Name Department, emp.Name Employee, emp.Salary
FROM (## 自定义变量RANK, 查找出 每个部门工资前三的排名
        SELECT te.DepartmentId, te.Salary,
               CASE 
                    WHEN @pre = DepartmentId THEN @rank:= @rank + 1
                    WHEN @pre := DepartmentId THEN @rank:= 1
               END AS 'RANK'
        FROM (SELECT @pre:=null, @rank:=0)tt,
             (## (部门,薪水)去重,根据 部门(升),薪水(降) 排序
                 SELECT DepartmentId,Salary
                 FROM Employee
                 GROUP BY DepartmentId,Salary
                 ORDER BY DepartmentId,Salary DESC
             )te
       )t
INNER JOIN Department dep ON t.DepartmentId = dep.Id
INNER JOIN Employee emp ON t.DepartmentId = emp.DepartmentId and t.Salary = emp.Salary and t.RANK <= 3
ORDER BY t.DepartmentId, t.Salary DESC ## t 结果集已有序,根据该集合排序

 2.删除重复的电子邮箱(196)

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

题解一

首先反向思维,找出不满足的,根据分组可以很简单找到

DELETE from Person
WHERE id NOT IN #不在满足条件内的肯定就是不满足的,直接删除
(
    SELECT ID #先把满足条件的找出来
    From
    (
     SELECT  MIN(id) as ID
     From Person
     Group by Email
    )t
)

题解二(官方解析)

# Write your MySQL query statement below
DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id

3.上升的温度(197)

表: Weather

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+
id 是这个表的主键
该表包含特定日期的温度信息

编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。

返回结果 不要求顺序 。

示例 1:

输入:
Weather 表:
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+
输出:
+----+
| id |
+----+
| 2  |
| 4  |
+----+
解释:
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)

解法一(DATEDIFF())

DATEDIFF 函数,可以计算两者的日期差

DATEDIFF('2007-12-31','2007-12-30');   # 1
DATEDIFF('2010-12-30','2010-12-31');   # -1

# Write your MySQL query statement below  

select a.ID
from weather as a cross join weather as b 
     on datediff(a.recordDate, b.recordDate) = 1
where a.temperature > b.temperature;

解法二(TIMESTAMPDIFF())

TIMESTAMPDIFF能干什么,可以计算相差天数、小时、分钟和秒,相比于datediff函数要灵活很多。格式是时间小的前,时间大的放在后面。 计算相差天数

select a.ID
from weather as a cross join weather as b 
     on timestampdiff(day,a.recordDate, b.recordDate) = -1
where a.temperature > b.temperature;

解法三(ADDDATE()力扣)

SQL力扣练习(六),SQL练习(力扣版),sql,leetcode,数据库

select a.id 
    from weather a join weather b 
    on (a.recorddate = adddate(b.recorddate,INTERVAL 1 day))
where a.temperature > b.temperature

 文章来源地址https://www.toymoban.com/news/detail-548978.html

到了这里,关于SQL力扣练习(六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库LeetCode每日练习(三)

    目录 前言 题目1:游戏玩法分析 题目2:订单最多的客户 题目3: 大的国家 题目4:连续出现的数字 题目小结 回顾前文精彩片段 数据库LeetCode每日练习(一)_小杰312的博客-CSDN博客 sql操作LeetCode每日练习 https://blog.csdn.net/weixin_53695360/article/details/123985354?spm=1001.2014.3001.5501 数据库

    2024年02月11日
    浏览(27)
  • SQL Server 数据库之SQL Server 数据库的安全设置

    数据库服务器是所有应用的数据中转站,若数据库服务被恶意攻击,可能会造成数据泄露、数据丢失、数据被恶意篡改等诸多无法挽回的损失; 所以,对数据库进行安全设置是每一个数据库管理人员都应掌握的知识; SQL Server 登录模式分为 “Windows 身份验证模式” 和 “SQL

    2024年02月06日
    浏览(73)
  • SQL力扣练习(十一)

    目录 1.树节点(608) 示例 1 解法一(case when) 解法二(not in) 2.判断三角形(610) 示例 1 解法一(case when) 解法二(if) 解法三(嵌套if) 3.只出现一次的最大数字(619) 示例 1 解法一(count limit) 解法二(max) 4.有趣的电影(620) 解法一 5.换座位(626) 示例 1 解法一(case when) 解法二(count mod case-when) 解法三

    2024年02月12日
    浏览(33)
  • SQL力扣练习(七)

    目录 1.行程和用户(262) 方法一(Left Join) 方法二(NOT IN) 方法三(Join) 2.游戏玩法分析I(511) 方法一(min) 3.游戏玩法分析I(550) 方法一(AVG) 表: Trips 表: Users 取消率  的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数

    2024年02月15日
    浏览(30)
  • SQL力扣练习(八)

    目录 1.至少有五名直接下属的经理(570) 方法一(in) 方法二(join) 方法三(row_number) 方法四(自连接) 2.员工奖金(577) 方法一(left join) 3.寻找用户推荐人(584) 方法一 4.2016年的投资(585) 示例 方法一(join,count) 方法二(in) 方法四(连接加 in) 表:  Employee 查询 至少有5名直接下属 的经理   。

    2024年02月15日
    浏览(28)
  • SQL力扣练习(六)

    目录 1. 部门工资前三高的所有员工(185) 题解一(dense_rank()窗口函数) 题解二(自定义函数)  2.删除重复的电子邮箱(196) 题解一 题解二(官方解析) 3.上升的温度(197) 解法一(DATEDIFF()) 解法二(TIMESTAMPDIFF()) 解法三(ADDDATE()力扣) 表:  Employee 表:  Department 公司的主管们感

    2024年02月13日
    浏览(28)
  • SQL力扣练习(九)

    目录 1.订单最多的用户(586) 示例 1 解法一(limit) 解法二(dense_rank()) 2.体育馆的人流量 示例 1 解法一(临时表) 解法二(三表法) 表:  Orders 查找下了  最多订单  的客户的  customer_number  。 测试用例生成后,  恰好有一个客户  比任何其他客户下了更多的订单。 查询结果格式如

    2024年02月14日
    浏览(31)
  • SQL力扣练习(五)

    目录  1.从不订购的客户(183) 解法一(not in) 解法二(is) 解法三(not exists) 解法四(isnull函数) 2.部门工资最高的员工(184) 解法一(in) 解法二(rank窗口函数) 某网站包含两个表, Customers  表和  Orders  表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。 Customers  表:

    2024年02月12日
    浏览(32)
  • SQL力扣练习(十)

    目录 1.体育馆的人流量(501) 示例 1 解法一(row_number()) 解法二(自定义变量) 解法三 2.好友申请(602) 示例 解法一(union all) 解法二 3.销售员(607) 示例 解法一 解法二 表: Stadium 编写一个 SQL 查询以找出每行的人数大于或等于  100  且  id  连续的三行或更多行记录

    2024年02月14日
    浏览(28)
  • SQL力扣练习(四)

    表: Employee   编写一个SQL查询来查找收入比经理高的员工。   示例 1: 在这里普及一下连接小知识。 1.​Left join:即左连接,是以左表为基础,根据ON后给出的两表的条件将两表连接起来。结果会将左表所有的查询信息列出,而右表只列出ON后条件与左表满足的部分。左连接全

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包