- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
描述
某处摆放着一些标有 id 的箱子,其中部分箱子是装有东西的,部分箱子是空闲的。
请编写 SQL 语句,找到空且连续的箱子,并将它们按照 id 递增排序后返回。
表定义: boxes (箱子表)
| 列名 | 类型 | 注释 |
|---|---|---|
| id | int | 主键 |
| is_empty | int | 箱子状态 (0 表示箱子占用,1 表示箱子空闲可用) |
**
提示:
- 连续空箱子是指:空的且连续的箱子 ≥ 2 个
- 数据保证 is_empty 的值为 0 或者 1
- 箱子们的 id 都是连续的
样例
样例一:
表内容: boxes
| id | is_empty |
|---|---|
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
在运行你的 SQL 语句之后,表应返回:
| id |
|---|
| 3 |
| 4 |
| 5 |
样例二:
表内容: boxes
| id | is_empty |
|---|---|
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 0 |
在运行你的 SQL 语句之后,表应返回:
| id |
|---|
| 3 |
| 4 |
题解
这道题的重点是什么呢?连续。连续的定义是什么1,2,3,4这样就是一个连续的id,这些数之间的联系就在于他们相差1。如果表示相差1,b-a=1,是不是就可以了。这里还有一个点就是distinct 去重,为啥需要去重呢。因为 abs(b1.id - b2.id)=1,这里的abs是为了b1.5取不到的问题,如果没有abs,那么最多取到4.但是一旦用abs相当于跑了两边for,一定会重复,所以这里需要去重。
select distinct b1.id
from boxes b1, boxes b2
where abs(b1.id - b2.id)=1 and b1.is_empty=1 and b2.is_empty=1 order by b1.id
``