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

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

题目来源:拼多多。

1 题目

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

样例数据

复制代码
+-----+
| id  |
+-----+
| 1   |
| 2   |
| 3   |
| 5   |
| 6   |
| 8   |
| 10  |
| 12  |
| 13  |
| 14  |
| 15  |
+-----+

2 建表语句

sql 复制代码
--建表语句
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()函数进行开窗计算与上一行的差值;

sql 复制代码
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()进行累积计算,获得分组依据字段。

sql 复制代码
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 diff
      from 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)得出结果

sql 复制代码
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_type
      from (select id,
                   id - lag(id) over (order by id) as diff
            from 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       |
+-------------+------------+----------+
相关推荐
寒月霜华7 分钟前
JavaWeb后端-MySQL
数据库·mysql
Fuly102415 分钟前
大模型的记忆与管理及长期记忆实现方式
数据库·人工智能·rag
weixin_3077791317 分钟前
C#程序实现将Teradata的存储过程转换为Azure Synapse Dedicated SQL pool的存储过程
数据库·数据分析·c#·云计算·azure
折翼的恶魔1 小时前
SQL 189 统计有未完成状态的试卷的未完成数和未完成率
数据库·sql
yangmf20401 小时前
如何使用 INFINI Gateway 增量迁移 ES 数据
大数据·数据库·elasticsearch·搜索引擎·gateway
运维李哥不背锅2 小时前
Ansible 的条件语句与循环详解
数据库·ansible
梦里不知身是客113 小时前
hive的SQL语句练习2
hive·hadoop·sql
曾凡宇先生3 小时前
OpenEuler中mysql这是在执行 MySQL 密码重置操作时出现的 “找不到mysqld_safe命令” 的错误场景。
数据库·mysql
梦里不知身是客113 小时前
hive的SQL练习3
hive·hadoop·sql
方二华3 小时前
6 mysql源码中的查询逻辑
数据库·mysql