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

embedded/2024/10/21 6:04:50/

目录

  • 1 题目
  • 2 建表语句
  • 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 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)得出结果

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_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       |
+-------------+------------+----------+

http://www.ppmy.cn/embedded/54030.html

相关文章

IPSEC VPN

IPSEC VPN IPSEC是为IP网络提供安全性的协议和服务的集合,是一种协议簇,一个基于网络层,应用密码学的安全信息协议组。一开始TCP/IP 没有考虑到信息的安全传输。IPSEC协议簇诞生的意义就是保证TCP/IP的安全传输。 伪头部校验:TCP再校验的时…

React 18

React Redux Router路由 TS 1 React 组件化开发方式、性能优秀(vnode、fiber)、丰富生态、跨平台支持(React native支持ios、安卓) 1.1 下载React项目 利用npx create-react-app react-basic下载项目,下载好项目…

深度学习之生成对抗网络StyleGAN3

StyleGAN3 是由 NVIDIA 团队提出的第三代生成对抗网络(GAN),在前代 StyleGAN 和 StyleGAN2 的基础上进行了改进,以实现更高质量的图像生成。StyleGAN3 的主要改进在于解决了 StyleGAN2 中存在的伪影(artifacts)问题,并且提升了生成图像的一致性和稳定性。 StyleGAN3 的…

GPT-5对普通人有何影响

这篇文章对ChatGPT的使用方法和提问技巧进行了讨论,重点强调了背景信息和具体提问的重要性。文章清晰地传达了如何提高ChatGPT回答的质量,以及个人在使用ChatGPT时的体会和建议。然而,文章在逻辑组织和表达方面还有一些可以改进的地方&#x…

举例说明计算机视觉(CV)技术的优势和挑战

计算机视觉(CV)技术是指让计算机系统能够理解和解释图像和视频数据的能力。它具有许多优势,但也面临一些挑战。 优势: 1. 高效性:CV技术可以快速地处理大量的图像和视频数据,使计算机能够在短时间内分析和…

ChatGPT的原理可以通俗易懂地介绍

ChatGPT的原理可以通俗易懂地介绍如下: 基础架构: ChatGPT基于OpenAI的GPT(Generative Pre-trained Transformer)模型,尤其是GPT-3的架构进行构建。GPT模型是一种基于Transformer架构的预训练语言模型,特别…

27、架构-微服务需要的条件

微服务需要的条件 在决定采用微服务架构之前,需要明确其前提条件。微服务架构不仅仅是技术上的变革,更涉及组织结构和团队文化的调整。以下是微服务需要的几个关键条件: 1. 组织结构 微服务的成功实施依赖于组织结构的支持。根据康威定律&…

展开说说:Android列表之RecyclerView

RecyclerView 它是从Android5.0出现的全新列表组件,更加强大和灵活。用于显示列表形式 (list) 或者网格形式 (grid) 的数据,替代ListView和GridView成为Android主流的列表组件。可以说Android客户端只要有表格的地方就有RecyclerView。 RecyclerView 内…