美文网首页
Leecode刷题笔记

Leecode刷题笔记

作者: 番茄酱的汪 | 来源:发表于2020-04-12 17:55 被阅读0次

Mysql处理前几高的问题

最近刷了leecode几道题,发现有个哥们的写法很棒
下面是为了自己找不到评论,所以引用过来的:
受之前某一题的某个大佬启发,对于这种分组内取前几名的问题,可以先group by然后用having count()来筛选,比如这题,找每个部门的工资前三名,那么先在子查询中用Employee和自己做连接,连接条件是【部门相同但是工资比我高】,那么接下来按照having count(Salary) <= 2来筛选的原理是:如果【跟我一个部门而且工资比我高的人数】不超过2个,那么我一定是部门工资前三,这样内层查询可以查询出所有符合要求的员工ID,接下来外层查询就简单了。

select d.Name as Department,e.Name as Employee,e.Salary as Salary
from Employee as e left join Department as d 
on e.DepartmentId = d.Id
where e.Id in
(
    select e1.Id
    from Employee as e1 left join Employee as e2
    on e1.DepartmentId = e2.DepartmentId and e1.Salary < e2.Salary
    group by e1.Id
    having count(distinct e2.Salary) <= 2
)
and e.DepartmentId in (select Id from Department)
order by d.Id asc,e.Salary desc

连续几行记录大于一个阈值的写法

  • 题目:
    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 |
+------+------------+-----------+

  • 写法:
select distinct a.* from stadium a,stadium b,stadium c
where a.people >=100 and b.people >=100 and c.people >=100
and 
(( a.id =b.id - 1 and b.id = c.id -1) or
( a.id = b.id -1 and a.id = c.id +1) or
( a.id = b.id +1 and b.id = c.id +1))
order by id

这个写法很妙,用了一个or的方法。我原来想的是三张表连起来,一行三列如果都满足大于阈值就可以了,但是只能提取第一天的id。
所以这里运用的是‘or’,可以1,2,3这样的顺序都大于阈值;也可以上一个、这一个、下一个都大于阈值,诸如此类。但是要有一个distinct,因为这个用的是where拼接,估计会出现很多个一样的行。这个要再试一试。

相关文章

  • LeeCode刷题笔记

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数...

  • Leecode刷题笔记

    Mysql处理前几高的问题 最近刷了leecode几道题,发现有个哥们的写法很棒下面是为了自己找不到评论,所以引用...

  • Leecode刷题

    刚发现leecode只需要编写主函数就行,不必去纠结读取输入和输出 1、给定一个整数数组 nums 和一个目标值 ...

  • 【学习】mysql学习

    20190528 一、数据分析深入浅出 二、mysql必知必会 三、leecode题库 刷leecode数据库题,...

  • leecode刷题(17)-- 实现StrStr

    leecode刷题(17)-- 实现StrStr 实现StrStr 描述: 实现 strStr() 函数。 给定一...

  • LeeCode刷题--Toeplitz Matrix

    题目 原题地址 A matrix is Toeplitz if every diagonal from top-l...

  • leecode刷题(18)-- 报数

    leecode刷题(18)-- 报数 报数 描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一...

  • LeeCode刷题笔记4:最长有效括号

    @[TOC](最长有效括号) 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串...

  • leecode刷题(22)-- 反转链表

    leecode刷题(22)-- 反转链表 反转数组 反转一个单链表。 示例: 进阶:你可以迭代或递归地反转链表。你...

  • leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右...

网友评论

      本文标题:Leecode刷题笔记

      本文链接:https://www.haomeiwen.com/subject/jusbmhtx.html