180. 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:
方法一:
select
DISTINCT a.num as ConsecutiveNums
from
Logs as a , Logs as b , Logs as c
where
a.num = b.num
and b.num = c.num=0
and a.id - b.id=1
and b.id - c.id=1
方法二:
select
distinct t.num as ConsecutiveNums
from
(SELECT
id,
num,
row_number() over(order by id) - row_number() over(partition by num order by id) as newNum
FROM
Logs) as t
group by
t.num,t.newNum
having
count(t.t.newNum)>=3
# select
# distinct t.num as ConsecutiveNums
# from
# (select
# a.num,
# a.groupId-b.groupNum as newNum
# from
# (SELECT
# id,
# num,
# row_number() over(order by id) as groupId
# FROM
# Logs) as a join
# (SELECT
# id,
# num,
# row_number() over(partition by num) as groupNum
# FROM
# Logs) as b on a.id = b.id) as t
# group by
# t.newNum
# having
# count(t.newNum)>=3
1459. 矩形面积
写一个 SQL 语句,报告由表中任意两点可以形成的所有 边与坐标轴平行
且 面积不为零
的矩形。
结果表中的每一行包含三列 (p1, p2, area) 如下:
- p1 和 p2 是矩形两个对角的 id
- 矩形的面积由列 area 表示
请按照面积=== area 大小降序排列;如果面积相同的话, 则按照 p1 升序排序;若仍相同,则按 p2 升序排列。===
查询结果如下例所示
select
p1.id as P1,
p2.id as P2,
abs(p1.x_value - p2.x_value) * abs(p1.y_value - p2.y_value) as AREA
from
Points as p1 , Points as p2
where
p1.id != p2.id and abs(p1.x_value - p2.x_value) * abs(p1.y_value - p2.y_value) >0
and p1.id < p2.id
order by
area desc,
p1 asc,
p2 asc
1988. 找出每所学校的最低分数要求
每年,学校会公布学生申请所需的最低分数要求
。学校根据所有学生的考试成绩来决定其最低分数要求。
- 学校希望确保即使每一个满足分数要求的学生都申请该学校,学校也有足够的能力接纳每一个学生。
- 学校也希望
尽可能
多的学生能申请该学校。 - 学校
必须
使用在 Exam 表中的 score 来作为最低分数要求。
编写一个SQL查询来查询每所学校的最低分数
要求。如果同时有多个score值满足上述要求,则选择其中最小的
一个。如果数据不足以决定最低分数要求
,那么输出 -1。
返回的结果表可以按任意顺序排序。
查询结果格式如下例所
方法一:
select
a.school_id,
ifnull(b.score , -1) as score
from
Schools as a left join
(select
s.school_id,
min(e.score) as score
from
Schools as s ,Exam as e
where
s.capacity >= e.student_count
group by
s.school_id
order by
s.school_id) as b on a.school_id=b.school_id
方法二:(推荐)
select
s.school_id,
ifnull(min(e.score) , -1) as score
from
Schools as s left join Exam as e on s.capacity >= e.student_count
group by
s.school_id