SQL进阶技巧:如何进行数字范围统计?| 货场剩余货位的统计查询方法

目录

0 场景描述

1 剩余空位区间和剩余空位编号统计分析 

2 查找已用货位区间

3 小结


0 场景描述

这是在做一个大型货场租赁系统时遇到的问题,在计算货场剩余存储空间时,不仅仅需要知道哪些货位是空闲的,还要能够判断出哪些货位之间是连续的。因为在新货物入场时,可以判断这些货物是否可以堆放在一起,而不是放在不连续的多个货位上,这样更便于管理,并且在出货时也更加迅速。

假设这个货场共有100个货位,现在已存放货物的货位是1、2、3、4、87、89、99、100,则剩余空位是5~86、88、90~98。数据库的设计方式一般有两种:一种是在表中为每个货位建一条记录,类似表1所示的结构设计;另一种设计方式是仅将存放有货物的货位号放在表中,也就是存货情况表中仅有货位编号列,存放1、2、3、4、87、89、99、100这几个数值。

存货情况表
货位编号是否存放有货物(1是,0否)
11
21
30
... ...... ....

相对于大型数据库而言,第一种架构设计对于查询语句编写方面会更方便一些。如果数据需要驻留在一些手持设备上,多数开发人员会更喜欢第二种架构设计,因为它能够节省宝贵的存储空间。尤其是当表的数据量非常大时,这种设计方式更能显示出它的优势。这里我们将以第二种架构设计方式来演示查询的创建方法,下面是创建示例表的语句。

create table freights as
select 1 id,1 numb
from dual
union all
select 2 id, 2 numb
from dual
union all
select 3 id,3 numb
from dual
union all
select 4 id,4 numb
from dual
union all
select 5 id,87 numb
from dual
union all
select 6 id,89 numb
from dual
union all
select 7 id,99 numb
from dual
union all
select 8 id,100 numb
from dual

 问题1:查找剩余空位区间和剩余空位编号?

 问题2:查找已用货位区间?

1 剩余空位区间和剩余空位编号统计分析 

要查找剩余空位区间,就是要找出表2所示的数值范围。 

剩余空位区间
货位开始编号货位结束编号
586
8888
9098

 要找出这些区间的开始和结束编号,需要在间断之前的值加1,在下一组编号开始之间的值减1。例如,表中的5~86是在4的基础上加1、在87的基础上减1得来的。

每一货位号的下一货位号

可以看出,只要找出n2-n1大于1的货位组,并在n1上加1,在n2上减1,就可以得到表19-8所示的剩余空位区间。参考下面的SQL语句。 

select id,n1 + 1 f_st,n2 - 1 f_et
from (select id,numb                          n1,lead(numb) over (order by id) n2from FREIGHTS) t
where n2 - n1 > 1
;

方法2:自关联形式实现


SELECT n1.Numb + 1      f_st,MIN(n2.Numb - 1) f_et
FROM Freights n1JOIN Freights n2ON n2.Numb > n1.Numb
GROUP BY n1.Numb
HAVING (n1.Numb + 1) < MIN(n2.Numb);

 如果希望返回的不是剩余空位区间,而是剩余空位编号,则需要建立一个全部的货位编号表。下面的语句使用了递归CTE循环来建立1~100的货位编号。


WITH numbs(n) AS(SELECT 1 AS n from dualUNION ALLSELECT n + 1FROM numbsWHERE n < 100)
SELECT n
FROM numbs;

只要全部货位编号在Freights表中不存在,则表示该货位号没有使用,参考下面的语句。

WITH numbs(n) AS(SELECT 1 AS nfrom dualUNION ALLSELECT n + 1FROM numbsWHERE n < 100)
SELECT n
FROM Numbs
WHERE n NOT IN (SELECT Numb FROM Freights)
N
86
41
28
76
25
90
31
32
16
33
20
57
6
27
61
60
77
82
65
21
10
79
95
23
73
68
37
85
53
59
88
17
52
63
45
14
9
78
38
22
43
84
44
54
70
49
58
98
24
62
55
42
5
36
8
69
80
13
39
11
29
66
34
91
26
15
75
18
51
30
72
92
46
83
56
50
48
64
12
19
93
96
94
7
47
71
67
74
40
35
81
97

 如果不需要返回全部的空货位号,而是几个的话,可以使用下面的查询语句。

SELECT numb, rn, (numb - rn) AS available_Numb
FROM (SELECT Numb, ROW_NUMBER() OVER (ORDER BY numb) rnFROM Freights) t
WHERE rn <> numb
NUMB	RN	AVAILABLE_NUMB
87	5	82
89	6	83
99	7	92
100	8	92

2 查找已用货位区间

现在已经使用的货位是1、2、3、4、87、89、99、100,已用货位区间即1~4、87~87、89~89、99~100。这些区间实际上是一组连续编号中的最小值和最大值,如1~4是货位1、2、3、4中的最小值和最大值。

上面的问题实际上是经典的连续性问题,我们按照连续性问题的通用处理方法来处理

select flg, min(n1) f_st, max(n1) f_ed
from (select id,n1,n2,--当状态一致时记为0,状态变化时记为1,相同状态的累计值不变,会持续状态开始前的值。sum(case when n1 - n2 <= 1 then 0 else 1 end) over (order by id) flgfrom (select id,numb                         n1,lag(numb) over (order by id) n2from FREIGHTS) t) tgroup by flg
order by flg
FLG	F_ST	F_ED
1	1	4
2	87	87
3	89	89
4	99	100

3 小结

本文使用SQL语言分析了一种货场剩余货位统计的查询算法。

如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。

专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价

专栏优势:
(1)一次收费持续更新。

(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特】

SQL很简单,可你却写不好?每天一点点,收获不止一点点-CSDN博客

(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的)

(4)数字化建设当中遇到难题解决思路及问题思考。

我的专栏具体链接如下:

 数字化建设通关指南_莫叫石榴姐的博客-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475935.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

彻底理解如何保证Redis和数据库数据一致性问题

一.背景 系统中缓存最常用的策略是&#xff1a;服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准&#xff0c;那么就可能出现 DB 和 Cache 数据不一致的问题。 二.读数据 逻辑如下&#xff1a; 当客户端发起查询数据的请求&#xff0c;首先回去Redis中查看没有没该数据&…

后仿真中的SDF语法之关键字 IOPATH 用法详解

在后仿真中&#xff0c;SDF&#xff08;Standard Delay Format&#xff09;文件用于描述设计的时序信息&#xff0c;而IOPATH是SDF中的一个关键结构&#xff0c;用于定义单元间的路径延迟。以下是IOPATH关键字的用法及其相关内容的详细介绍&#xff1a; IOPATH结构旨在将延迟数…

Springboot 整合 Java DL4J 搭建智能问答系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

基于SpringBoot的“网上书城管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“网上书城管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统首页界面图 用户注册界面…

测评部署和管理 WordPress 最方便的面板

新版宝塔面板快速搭建WordPress新手教程 - 倚栏听风-Morii - 博客园 初学者使用1Panel面板快速搭建WordPress网站 - 倚栏听风-Morii - 博客园 可以看到&#xff0c;无论是宝塔还是1Panel&#xff0c;部署和管理WordPress都有些繁琐&#xff0c;而且还需要额外去配置Nginx和M…

网络安全问题概述

1.1.计算机网络面临的安全性威胁 计算机网络上的通信面临以下的四种威胁&#xff1a; (1) 截获——从网络上窃听他人的通信内容。 (2) 中断——有意中断他人在网络上的通信。 (3) 篡改——故意篡改网络上传送的报文。可应用于域名重定向&#xff0c;即钓鱼网站。 (4) 伪造——伪…

视觉顶会论文 | 基于Swin Transformer的轴承故障诊断

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

Altenergy电力系统控制软件 status_zigbee SQL注入漏洞复现(CVE-2024-11305)

0x01 产品简介 Altenergy电力系统控制软件是Altenergy Power System推出的一款专业软件。旨在为用户提供全面、高效、安全的电力系统控制解决方案。广泛应用于各类电力系统领域,如电力调度中心、发电厂、变电站、工业园区等。通过该软件的应用,用户可以实现对电力系统的全面…

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体&#xff0c;也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎* 描述&#xff1a;* # Author : geovindu,Geovin Du 涂…

AUTOSAR网络管理中的主动唤醒与被动唤醒

文章目录 1、主动/被动唤醒源、主动/被动唤醒节点2、网络拓扑说明 1、主动/被动唤醒源、主动/被动唤醒节点 休眠唤醒需要有一个触发源来进行触发&#xff0c;我们常用的NM报文是其中的载体之一。休眠唤醒的触发源又分为主动唤醒源和被动唤醒源。 主动唤醒源&#xff0c;就是能…

索贝融媒体 Sc-TaskMonitoring/rest/task/search SQL注入漏洞复现

0x01 产品简介 索贝融媒体产品是成都索贝数码科技股份有限公司(简称索贝)为各级电视台和媒体机构打造的一套集互联网和电视融合生产的解决方案。其代表产品为MCH2.0融合媒体生产业务系统,该系统带来了媒体领域一种全新的融合生产流程和工作机制,具有全方位的资源汇聚能力、…

【PyTorch】Pytorch中torch.nn.Conv1d函数详解

1. 函数定义 torch.nn.Conv1d 是 PyTorch 中用于一维卷积操作的类。定义如下&#xff1a; 官方文档&#xff1a;https://pytorch.ac.cn/docs/stable/generated/torch.nn.Conv1d.html#torch.nn.Conv1d torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride1,paddi…

[大数据]Trino

Trino安装部署-CSDN博客 Central Repository: io/trino/trino-server 下载地址: repo1.maven.org/maven2/io/trino/Central Repository: io/trino/trino-serverhttps://repo1.maven.org/maven2/io/trino/trino-server/ vim /etc/security/limits.conf * soft nofile 131072…

三种复制只有阅读权限的飞书网络文档的方法

大家都知道&#xff0c;飞书是一款功能强大的在线协作工具&#xff0c;可以帮助团队更高效地协作和沟通。越来越多的资料都在使用飞书文档&#xff0c;在使用飞书的过程中&#xff0c;发现很多文档没有复制权限&#xff0c;如果想要摘抄笔记&#xff0c;只能一个字一个字地敲出…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…

解决upload上传之后,再上传没有效果

解决upload上传之后&#xff0c;再上传没有效果 注释&#xff1a;这是第二次上传&#xff0c;两次网络请求都是第一次上传的&#xff0c;这次上传没有网络请求 原因&#xff1a;在我的代码里我限制了上传数量为1&#xff0c;然后上传成功后&#xff0c;上传列表没有清空&#…

【Linux】<共享内存应用>——模拟实现不同进程把hello字符对<共享内存文件对象>的放入和取出操作

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…

视频修复技术和实时在线处理

什么是视频修复&#xff1f; 视频修复技术的目标是填补视频中的缺失部分&#xff0c;使视频内容连贯合理。这项技术在对象移除、视频修复和视频补全等领域有着广泛的应用。传统方法通常需要处理整个视频&#xff0c;导致处理速度慢&#xff0c;难以满足实时处理的需求。 技术发…