Leecode刷题笔记

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拼接,估计会出现很多个一样的行。这个要再试一试。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一. Java基础部分.................................................
    wy_sure阅读 4,035评论 0 11
  • 一、基本增删改查二、创建索引的几种方式三、单表查询四、连表查询 一、基本增删改查 1.数据库的增删改查 show ...
    清风徐来_简阅读 462评论 0 1
  • 一、SQL速成 结构查询语言(SQL)是用于查询关系数据库的标准语言,它包括若干关键字和一致的语法,便于数据库元件...
    shadow雨轩阅读 592评论 0 3
  • 进阶7:子查询 /*含义:出现在其他语句中的select语句,称为子查询或内查询外部的查询语句,称为主查询或外查询...
    majorty阅读 3,074评论 0 1
  • 1、count 使用 1.1 查询employee表中记录数: SELECT COUNT(*) FROM empl...
    四月四七日薄暮阅读 327评论 0 0

友情链接更多精彩内容