SQL 确定序列里缺失值的范围
时间:2022-07-22
本文章向大家介绍SQL 确定序列里缺失值的范围,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有一个序列表 seq
,它有一个存整数序列值的字段叫作 id,原本序列的值是连续递增的,但因某些原因,有的值丢失了,我们希望能通过 SQL 找出缺失值的范围。
先来构造有缺失值的 seq
表,可以用 SQL 派生出这个表。
WITH seq AS(
SELECT 1 AS id
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 12
UNION ALL SELECT 13
UNION ALL SELECT 15
UNION ALL SELECT 18
UNION ALL SELECT 19
UNION ALL SELECT 20
)
我们观察数据可知,seq
表中目前最大的数是 20,缺失的值有:4、9、10、11、14、16、17。这些缺失值的范围是:
start |
stop |
---|---|
4 |
4 |
9 |
11 |
14 |
14 |
16 |
17 |
上表就是我们需要通过 SQL 生成的结果。
接下来说说实现 SQL 的思路。
第一,把 seq 表中 id 字段的每个值 + 1 后再和 seq
表中的数比较,如果不在 seq
表中,说明该数 + 1 是缺失值,且是一段缺失值的范围的起始值。
SELECT
s.id + 1 AS START
FROM
seq AS s
LEFT JOIN seq AS r
ON s.id = r.id - 1
WHERE r.id IS NULL
查出来的结果如下,21 不应该出现,后面我们会加条件过滤掉。
START
--------
4
9
14
16
21
第二,在找到所有缺失数据的范围的起始值后,再从 seq
表中找到大于起始值的最小值 upper,upper - 1 就是该段缺失范围的结束值。比如对于缺失值 9,在 seq
表中能找到大于 9 的最小值是 12,12 - 1 = 11 就是该段缺失数据的范围的结束值。
SELECT
(SELECT
MIN(id) - 1
FROM
seq AS xx
WHERE xx.id > s.id) AS STOP
FROM
seq AS s
LEFT JOIN seq AS r
ON s.id = r.id - 1
WHERE r.id IS NULL
下面是找到的结束值,因为 21 原本不存在,所以它的结束值是 NULL。
STOP
--------
4
11
14
17
(NULL)
最后,加上过滤条件,完整的 SQL 如下:
SELECT
START,
STOP
FROM
(SELECT
s.id + 1 AS START,
(SELECT
MIN(id) - 1
FROM
seq AS xx
WHERE xx.id > s.id) AS STOP
FROM
seq AS s
LEFT JOIN seq AS r
ON s.id = r.id - 1
WHERE r.id IS NULL) AS t
WHERE STOP IS NOT NULL
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- linux压缩文件命令zip的实例用法
- centos下samba文件夹共享服务器配置详解
- Centos7安装FFmpeg音/视频工具简易文档
- Linux 进程通信之FIFO的实现
- Linux nl命令的使用方法
- Linux gcc命令的具体使用
- Linux dirname命令的具体使用
- Linux 相对路径和绝对路径的使用
- Linux basename命令的使用方法
- 在Ubuntu上搭建一个基于webrtc的多人视频聊天服务实例代码详解
- linux中权限管理命令详解(chmod/chown/chgrp/unmask)
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- linux防火墙状态查看的方法实例
- 详解在linxu下Svn一键安装shell脚本
- Linux中screen命令及使用方法