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.mzph.cn/diannao/61463.shtml

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

相关文章

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域

量子计算在解决复杂问题和处理大规模数据集方面具有巨大的潜力&#xff0c;远远超过了经典计算机的能力。当与人工智能&#xff08;AI&#xff09;集成时&#xff0c;量子计算可以带来革命性的突破。它的并行处理能力能够在更短的时间内解决更复杂的问题&#xff0c;这对优化和…

教程 - 在 Creo Elements/Pro 中使用 Mechanica 分析杆的 von-mises 应力?

这是教程。 步骤1&#xff1a; 在“零件”模式下启动 Creo Elements/Pro。 步骤2&#xff1a; 草绘>>顶平面并绘制一个直径为 20mm 的圆。 步骤3&#xff1a; 将其挤出 200 毫米。 步骤4&#xff1a; 应用>>机械. 步骤5&#xff1a; 单击“确定”&…

ssm框架-spring-spring声明式事务

声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可&#xff0c; 具体事务的实现由第三方框架实现&#xff0c;避免我们直接进行事务操作&#xff01; 使用声明式事务可以将事务的控制和业务逻辑分离开来&#xff0c;提…

基于单片机的多功能跑步机控制系统

本设计基于单片机的一种多功能跑步机控制系统。该系统以STM32单片机为主控制器&#xff0c;由七个电路模块组成&#xff0c;分别是&#xff1a;单片机模块、电机控制模块、心率检测模块、音乐播放模块、液晶显示模块、语音控制模块、电源模块。其中&#xff0c;单片机模块是整个…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

C# 数据结构之【图】C#图

1. 图的概念 图是一种重要的数据结构&#xff0c;用于表示节点&#xff08;顶点&#xff09;之间的关系。图由一组顶点和连接这些顶点的边组成。图可以是有向的&#xff08;边有方向&#xff09;或无向的&#xff08;边没有方向&#xff09;&#xff0c;可以是加权的&#xff…

短剧系统小程序开发产品设计实例解析

短剧系统小程序开发架构深度解析引言 随着数字娱乐市场的蓬勃发展&#xff0c;短剧因其紧凑的情节、创新的表现形式和便捷的观看体验&#xff0c;迅速吸引了大量观众的关注。作为承载短剧内容的重要平台&#xff0c;短剧系统小程序不仅需要在用户体验、内容管理等方面做到极致&…

AI数字人视频小程序:引领未来互动新潮流

当下&#xff0c;随着人工智能技术的不断创新发展&#xff0c;各类AI系统已经成为了创新市场发展的重要力量&#xff0c;AI文案、AI数字人、AI视频等&#xff0c;为大众带来更加便捷的创作方式&#xff0c;AI成为了一个全新的风口&#xff0c;各种AI红利持续释放&#xff0c;市…

解决vue-pdf的签章不显示问题

在使用vue-pdf 4.3.0时发现上传一般的普通pdf正常预览&#xff0c;但是上传带有红头文件的和和特殊字体的pdf无法正常内容显示&#xff0c;文字丢失问题。 1、查看控制台报错信息 2、缺少字体原因 getNumPages(url) {var loadingTask pdf.createLoadingTask({url: url,//引入…

跨境电商API接口:数据采集与业务集成的核心

跨境电商作为全球贸易的重要组成部分&#xff0c;正随着互联网技术的发展而迅速增长。在这个过程中&#xff0c;API接口扮演了至关重要的角色&#xff0c;它们不仅提高了运营效率&#xff0c;还增强了安全性和用户体验。本文将深入探讨跨境电商API接口的应用、重要性以及面临的…

【linux013】文件操作命令篇 - less 命令

文章目录 less 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 less 命令 less 是 Linux 中强大的文件分页查看命令&#xff0c;比 more 更灵活且功能更强大。less 支持双向滚动、搜索、显示大文件等功能&#xff0c;适用于查看文件内容或管道输出的大量文本…

力扣 无重复字符的最长字串-3

无重复字符的最长字串-3 class Solution { public:// 解决方法&#xff1a;双指针int lengthOfLongestSubstring(string s) { // 如果字符串为空&#xff0c;直接返回0if (s.length() 0)return 0;// 如果字符串不为空&#xff0c;字符串每个字符都不同的情况下&#xff0c;最…

如何在Ubuntu当中利用CloudCompare软件进行点云配准拼接?

1.首先需要安装相应的cloudcompare软件&#xff0c;以下有两种方式&#xff1a;第一种直接在ubuntu的软件商店里搜索CloudCompare软件进行install&#xff0c;我这里已经安装完毕。 方式二&#xff1a;可以直接原码安装&#xff1a; github地址&#xff1a; https://github.co…

贴贴,一款windows剪切板管理软件

贴贴&#xff0c;一款windows剪切板管理软件 软件下载官网 https://tietieapp.com 软件界面 软件界面简洁、信息展示清晰。软件会自动记录你复制过的内容。包括哪个软件复制的、复制的时间。支持图片、文本、文件等多种格式。支持持久化&#xff0c;电脑重启记录仍然存在。支持…

RocketMQ的使⽤

初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种⽅式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要⻢上回复。 两种⽅式各有优劣&#xff0c;打电话可以⽴即得到响应&#xff0c;但…

初试无监督学习 - K均值聚类算法

文章目录 1. K均值聚类算法概述2. k均值聚类算法演示2.1 准备工作2.2 生成聚类用的样本数据集2.3 初始化KMeans模型对象&#xff0c;并指定类别数量2.4 用样本数据训练模型2.5 用训练好的模型生成预测结果2.6 输出预测结果2.7 可视化预测结果 3. 实战小结 1. K均值聚类算法概述…

JSON,事件绑定

文章目录 JSON事件绑定输入框input和div的内容返回获取dom元素数组还是单个对象for循环为什么要写const那一行&#xff0c;直接写 hobbys[index].checked true;可以吗const不是常量吗&#xff0c;为什么用const声明的element的属性值可以改变&#xff1f; 黑马学习笔记 JSON 定…

学习HTML第三十一天

学习文章目录 七. 普通按钮八. 文本域九.下拉框 七. 普通按钮 注意点&#xff1a;普通按钮的 type 值为 button &#xff0c;若不写 type 值是 submit 会引起表单的提交 八. 文本域 常用属性如下&#xff1a; rows 属性&#xff1a;指定默认显示的行数&#xff0c;会影响文…

基于Multisim的汽车尾灯控制电路设计与仿真

1、电路由四个按键控制&#xff0c;分别对应左转、右转、刹车和检查。 2、当左转或右转键按下时,左侧或右侧的 3个汽车尾灯按照左循环或右循环的顺!2/3 点亮&#xff0c;点亮时间为 1秒。 3、当刹车时&#xff0c;所有的尾灯同时闪烁&#xff0c;闪烁时间为1秒。 4、当检查时…