您的位置:首页 > 游戏 > 手游 > SQL面试题练习 —— 求连续段的起始位置和结束位置

SQL面试题练习 —— 求连续段的起始位置和结束位置

2024/10/7 4:24:52 来源:https://blog.csdn.net/hu_wei123/article/details/140016768  浏览:    关键词:SQL面试题练习 —— 求连续段的起始位置和结束位置

目录

  • 1 题目
  • 2 建表语句
  • 3 题解

题目来源:拼多多。

1 题目


有一张表t_id记录了id,id不重复,但是会存在间断,求出连续段的起始位置和结束位置。

样例数据

+-----+
| id  |
+-----+
| 1   |
| 2   |
| 3   |
| 5   |
| 6   |
| 8   |
| 10  |
| 12  |
| 13  |
| 14  |
| 15  |
+-----+

2 建表语句


--建表语句
CREATE TABLE t_id (
id bigint COMMENT 'ID'
) COMMENT 'ID记录表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
;
-- 插入数据
insert into t_id(id)
values
(1),
(2),
(3),
(5),
(6),
(8),
(10),
(12),
(13),
(14),
(15)

3 题解


(1)lag()函数进行开窗计算与上一行的差值;

select id,id - lag(id) over (order by id) as diff
from t_id

执行结果

+-----+-------+
| id  | diff  |
+-----+-------+
| 1   | NULL  |
| 2   | 1     |
| 3   | 1     |
| 5   | 2     |
| 6   | 1     |
| 8   | 2     |
| 10  | 2     |
| 12  | 2     |
| 13  | 1     |
| 14  | 1     |
| 15  | 1     |
+-----+-------+

(2)获得分组字段

根据diff进行判断,如果差值为1代表连续赋值为0,否则代表不连续赋值为1,然后使用sum()进行累积计算,获得分组依据字段。

select id,sum(if(diff = 1, 0, 1)) over (order by id) as group_type
from (select id,id - lag(id) over (order by id) as difffrom t_id) t

执行结果

+-----+-------------+
| id  | group_type  |
+-----+-------------+
| 1   | 1           |
| 2   | 1           |
| 3   | 1           |
| 5   | 2           |
| 6   | 2           |
| 8   | 3           |
| 10  | 4           |
| 12  | 5           |
| 13  | 5           |
| 14  | 5           |
| 15  | 5           |
+-----+-------------+

(3)得出结果

select group_type,min(id) as start_pos,max(id) as end_pos
from (select id,sum(if(diff = 1, 0, 1)) over (order by id) as group_typefrom (select id,id - lag(id) over (order by id) as difffrom t_id) t) tt
group by group_type

执行结果

+-------------+------------+----------+
| group_type  | start_pos  | end_pos  |
+-------------+------------+----------+
| 1           | 1          | 3        |
| 2           | 5          | 6        |
| 3           | 8          | 8        |
| 4           | 10         | 10       |
| 5           | 12         | 15       |
+-------------+------------+----------+

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com