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