如何为每种产品找到合适尺寸的盒子?

2023-12-01

很抱歉重新上传这个问题,但我真的想要答案。

请允许我再次问这个问题并希望您的支持。


问题是找到合适尺寸的盒子,让物流企业在运输时节省资金。

我们有两张桌子,分别是盒子和产品。

盒子表包含每个盒子的 ID 和尺寸。 “w”代表宽度,“d”代表深度,“h”代表高度。为了方便起见,请假设我们只有 3 盒样品。

产品表还包括产品 ID、尺寸。维度与盒子表的含义相同。 “可平放”是指产品不仅可以平放包装,还可以平放包装。例如,产品“g”是易碎瓶子,无法水平放置在盒子中。因此,这是可放置列中的“n”。

本题需要查询每个产品ID的大小合适的框。 合适尺寸的盒子意味着产品需要使用空间最小的盒子来运输。

希望您的好心帮助。谢谢。

boxes:

BOX_SIZE W D H
S 353 250 25
M 450 350 160
L 610 460 460

产品:

ID W D H LAYABLE
a 350 250 25 y
b 450 250 160 y
c 510 450 450 y
d 350 250 25 y
e 550 350 160 y
f 410 400 430 n
g 350 240 25 n
h 450 350 160 n
i 310 360 430 n
j 500 500 600 y

预期输出:

ID BOX_SIZE
a S
b M
... ....
... ....
... ....
g S
h M
i L
j not available

创建和填充测试表的语句:

create table boxes
    ( box_size char(1) primary key
    , w        number  not null
    , d        number  not null
    , h        number  not null
    )
;

insert into boxes (box_size, w, d, h) values ('S', 353, 250,  25);
insert into boxes (box_size, w, d, h) values ('M', 450, 350, 160);
insert into boxes (box_size, w, d, h) values ('L', 610, 460, 460);

create table products
    ( id      varchar2(10) primary key
    , w       number       not null
    , d       number       not null
    , h       number       not null
    , layable char(1)      check(layable in ('y', 'n'))
    )
;

insert into products (id, w, d, h, layable) values ('a', 350, 250,  25, 'y');
insert into products (id, w, d, h, layable) values ('b', 450, 250, 160, 'y');
insert into products (id, w, d, h, layable) values ('c', 510, 450, 450, 'y');
insert into products (id, w, d, h, layable) values ('d', 350, 250,  25, 'y');
insert into products (id, w, d, h, layable) values ('e', 550, 350, 160, 'y');
insert into products (id, w, d, h, layable) values ('f', 410, 400, 430, 'n');
insert into products (id, w, d, h, layable) values ('g', 350, 240,  25, 'n');
insert into products (id, w, d, h, layable) values ('h', 450, 350, 160, 'n');
insert into products (id, w, d, h, layable) values ('i', 310, 360, 430, 'n');
insert into products (id, w, d, h, layable) values ('j', 500, 500, 600, 'y');    

commit;

当然,关键是两个表之间的联接。我首先单独展示它,而不是完整的查询,以帮助理解。对于每件物品,我们都会找到可容纳该物品的所有盒子尺寸。

在所有情况下,如果产品高度 rotated以适合盒子,无论它们是否可放置)。

仅对于可放置的产品,我们可以在所有三个维度上旋转产品以将其装入盒子中。这意味着,仅对于可铺设产品,我们可以将产品宽度或深度与盒子高度进行比较,并将产品的其余两个尺寸与盒子宽度和深度进行比较。

一旦我们理解了我刚才所说的(就像我们在没有计算机的情况下,只需用铅笔在纸上做这件事的方式一样),翻译成代码几乎是自动的:

select p.id, b.box_size
from   products p left outer join boxes b
       on
            p.h <= b.h and least   (p.w, p.d) <= least   (b.w, b.d)
                       and greatest(p.w, p.d) <= greatest(b.w, b.d)
       or
       p.layable = 'y'
          and
          ( p.w <= b.h and least   (p.h, p.d) <= least   (b.w, b.d)
                       and greatest(p.h, p.d) <= greatest(b.w, b.d)
            or
            p.d <= b.h and least   (p.w, p.h) <= least   (b.w, b.d)
                       and greatest(p.w, p.h) <= greatest(b.w, b.d)
          )
;

Output:

ID  BOX_SIZE
--- --------
a   S       
a   M       
a   L       
b   M       
b   L       
c   L       
d   S       
d   M       
d   L       
e   L       
f   L       
g   S       
g   M       
g   L       
h   M       
h   L       
i   L       
j      

对于每种产品,我们找到了所有合适的尺寸。

请注意查询中的外连接,以包含不适合任何盒子尺寸的产品;产品就是这样j,它出现在输出的末尾。请注意,我使用null作为“的标记无法使用” - “不可用”一词不会比简单使用添加任何有价值的信息null.

下一步是一个简单的聚合 - 对于每个产品,找到有效的最小尺寸。最好的工具是FIRST聚合函数(如下所用)。我们必须按盒子尺寸订购;由于尺寸为 S、M、L(无意中按字母顺序相反排列),所以我使用decode()函数将 1 分配给 S、2 分配给 M、3 分配给 L。聚合查询查找适用于每个产品的“第一个”尺寸。

这里重要的是,查询可以轻松地推广到任意数量的可能的“盒子大小” - 即使并非所有三个维度都按升序排列。 (您也可以拥有只有一个尺寸很大而其他尺寸很小的盒子,等等)。您可以按箱量订购,也可以存放在盒子表中优先顺序,相当于我在查询中所做的decode()功能。

最后,查询和输出如下所示。请注意,我使用了nvl() in the select子句生成'not available'对于最后一项,以防万一您真的需要它(我对此表示怀疑,但这不是我的业务问题。)

select p.id, 
       nvl(  min(b.box_size) keep (dense_rank first 
             order by decode(b.box_size, 'S', 1, 'M', 2, 'L', 3))
          , 'not available') as box_size
from   products p left outer join boxes b
       on
            p.h <= b.h and least   (p.w, p.d) <= least   (b.w, b.d)
                       and greatest(p.w, p.d) <= greatest(b.w, b.d)
       or
       p.layable = 'y'
          and
          ( p.w <= b.h and least   (p.h, p.d) <= least   (b.w, b.d)
                       and greatest(p.h, p.d) <= greatest(b.w, b.d)
            or
            p.d <= b.h and least   (p.w, p.h) <= least   (b.w, b.d)
                       and greatest(p.w, p.h) <= greatest(b.w, b.d)
          )
group  by p.id
;

ID  BOX_SIZE
--- --------
a   S       
b   M       
c   L       
d   S       
e   L       
f   L       
g   S       
h   M       
i   L       
j   not available   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为每种产品找到合适尺寸的盒子? 的相关文章

  • SQL Server:十进制精度/小数位数产生奇怪的结果

    我正在为一个项目编写一些 SQL 我注意到 SQL Server 中一些看似奇怪的行为 涉及除以小数时的答案 以下是一些示例 说明了我所看到的行为 DECLARE Ratio Decimal 38 16 SET Ratio CAST 210
  • 高级 MySQL:查找民意调查响应之间的相关性

    我有四个 MySQL 表 users 身份证号 姓名 polls ID 文本 options id poll id 文本 回应 id poll id 选项 id 用户 id 给定一个特定的民意调查和一个特定的选项 我想生成一个表格 显示其他
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 存储过程 EXEC 与 sp_executesql 的区别?

    我写了两个存储过程 其中一个是sp executesql而其他没有 sp executesql 两者都正确执行相同的结果 我不明白两者之间有什么区别 EXEC SQL 与 EXEC sp executesql SQL N eStatus v
  • oracle中有没有相当于sp_getapplock、sp_releaseapplock的

    我需要能够在 Oracle 中的会话级别 事务范围之外 使用自定义锁 在 MSSQL 中 我使用 sp getapplock sp releaseapplock 如何在 Oracle 中实现相同的功能 DBMS LOCK 包 这将做你想做的
  • 使用 START WITH 和 CONNECT BY PRIOR 将查询从 oracle 迁移到 postgresql

    我正在将一个进程从 oracle 迁移到 postgresql 并且在它们的转换方面遇到了另一个问题 我一直在研究如何迁移oracle查询 它有 START WITH 和 CONNECT BY PRIOR 我已经对此进行了记录 我认为最简单
  • 将记录与另一个表上的最新记录连接

    我正在尝试创建一个 SQL 视图 我如何从一个表中选择最新的记录 而其他记录保持原样 我需要从所有表中选择所有记录 这工作正常 但我需要仅按日期选择最新的提案 这是我遇到的问题 这是我到目前为止所拥有的 SELECT TOP 100 PER
  • ssis将N个表从源服务器加载到目标服务器的最佳实践

    我需要将 N 个 大约 50 个 表从源数据库加载到目标数据库 每个表都与其他表不同 因此元数据不同 我想我可以使用父 pkg 来调用子 pkg 其中每个子 pkg 都有简单的结构 例如 DFT 来映射要导入的表 1 个子 pkg gt 1
  • 使用绑定变量动态传递表名和列名

    有没有办法使用绑定变量将列名和表名动态传递给查询 这可以通过使用简单的串联运算符来完成 但我想要一种不同的方法来实现这一目标 EDIT OPEN abc cur FOR Select column name from table name
  • 查找缺失值

    我有一个表 有 2 个重要的列 DocEntry WebId 样本数据就像 DocEntry WebId 1 S001 2 S002 3 S003 4 S005 现在我们可以注意到 在 WebId 列中 S004 丢失了 我们如何通过查询找
  • 有向图 SQL

    我有以下数据集 它表示有向图中的节点 CREATE TABLE nodes NODE FROM VARCHAR2 10 NODE TO VARCHAR2 10 INSERT INTO nodes VALUES GT TG INSERT IN
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • 如何使用 pgAdmin 恢复 postgreSQL 转储文件?

    我有一个 dmp 文件 想要从中恢复数据库 使用 pgAdmin 我该怎么做 在 PgAdmin3 内 在您正在使用的服务器中创建一个新数据库 右键单击该数据库并选择 恢复 使用 浏览器 按钮选择 dmp 文件 选择 恢复 开始恢复数据库
  • LINQ-to-SQL 是否支持组合查询?

    作为一名不懂 C 的程序员 我对 LINQ 查询的求值语义很好奇 如下所示 var people from p in Person where p age lt 18 select p var otherPeople from p in p
  • mysql变量赋值:如何强制赋值顺序?

    由于mysql是一种声明性语言 我找不到强制赋值变量顺序的方法 采取这个查询 SET v1 0 SET v2 0 SELECT v1 v2 FROM MyTable table WHERE v1 v2 is not null AND v2
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • 对 SQL Server 2005 结果进行分页

    如何在 SQL Server 2005 中对结果进行分页 我在 SQL Server 2000 中尝试过 但没有可靠的方法来做到这一点 我现在想知道SQL Server 2005是否有任何内置方法 分页的意思是 例如 如果我按用户名列出用户
  • 通用 Oracle 数据收集存储

    我正在设计一个新的实验室数据库 我想将所有测试的原始结果存储在一起 在某些情况下 结果是单个值 然而 结果有时是原始波形或信号 下面哪种情况是理想的 以及为什么 或提供您自己的理想选择 选项 1 将每个单独的数据点存储为单独的结果行 距 t
  • 左连接,左表中没有重复行

    请看下面的查询 tbl 目录 Content Id Content Title Content Text 10002 New case Study New case Study 10003 New case Study New case S
  • 左连接 SQL 求和

    我有两张桌子想要加入 比如说表 a 和表 b 表 b 有许多行指向表 a 表 b 包含价格 实际上是一个购物篮 所以我想要的是表a中的所有记录和表b中的价格之和 我努力了 select a sum b ach sell from booki

随机推荐

  • Cstring 到 BYTE 的转换

    我正在使用 Visual Studio c 想要将 Cstring 转换为 Byte 我已经编写了这段代码 但它在第二行给了我错误 数据 未定义 CString data T OK LPBYTE pByte new BYTE data Ge
  • 无法替换字符串中的字符

    我试图遍历一个字符数组 并将字符串中的该字符替换为另一个数组中的并行字符 private String replace String input char first a e o s char second 3 0 String myCop
  • 如何在C#中拦截调试信息(Debugview风格)?

    出于测试目的 我计划组装一个小应用程序 该应用程序将侦听来自应用程序的特定事件并在此时与其交互 鉴于我们正处于测试过程中不可能更改应用程序代码的阶段 从我的角度来看 理想的做法是监听应用程序的调试跟踪 有点像 debugview 所做的那样
  • TinyMCE 文本编辑器未加载我的文本

    我在我的页面中使用 TinyMCE 但它没有加载所需的 Html 文本 我使用以下代码在 Javascript 中动态创建了此文本 但在使用 TinyMCE 文本编辑器后 该文本未加载到 TinyMCE 文本编辑器中 mytextAreaI
  • Rcpp 会导致段错误 RcppArmadillo 不会

    我目前正在尝试并行化现有的分层 MCMC 采样方案 我的大部分 现在是顺序的 源代码都是用 RcppArmadillo 编写的 所以我也想坚持使用这个并行化框架 在开始并行化我的代码之前 我阅读了几篇关于 Rcpp Openmp 的博客文章
  • 404 找不到静态文件 - Django

    我对 django 有疑问 我最近购买了一个共享服务器的实例 我想将我的 django 网站从 AWS 移动到该服务器 使用 Cpanel 在 AWS 上一切正常 但当我切换到 Cpanel 时 所有静态文件都丢失了 这是我的设置 py S
  • 无法处理 DOMSource:检查 saxon9-dom.jar 是否位于类路径上

    当我运行一个简单的函数来更新没有 jar 的 DOM XML 时 它运行正确 如果我将其代码放入包含许多 jar 的现有项目中 则会出现此异常 线程 main 中的异常java lang RuntimeException net sf sa
  • Django 静态文件开发

    从该主题上类似标题的数量来看 这似乎是一个令人困惑的来源 但是尝试了我在 django 开发服务器上在静态文件上能找到的所有内容 我几乎放弃了希望 所以我的静态文件是从C Users Dan seminarWebsite static 其中
  • 垂直居中 文本,旁边是一个更大的 ,两者都在

    我正在尝试将一些文本垂直居中 span 元素 相对于更大的 span 这是第一个的兄弟姐妹 两者都是包含父母的孩子 div 元素 HTML div span class previewLabel Preview span span clas
  • 识别并替换字符向量中的重复块

    我有一个字符串向量a a c Chemistry Chemistry Math English Math Math Physics Physics Chemistry 有没有一种快速简单的方法可以制作如下 c Chemistry NA Ma
  • 使用现有的 Mysql 数据库构建 Ruby on Rails 应用程序

    我有一个Mysql数据库 里面有大量的数据和表 但我需要知道如何在我的新 Rails 应用程序中使用此 Mysql 数据 我已经学习 Rails 有一段时间了 我知道创建脚手架的基础知识 脚手架又创建模型和控制器 但我不清楚如何导入数据库并
  • 不允许在 DTD 和 XSD 模式中声明非确定性元素的原因是什么?

    以下声明 根据验证器和对规范的快速检查 其 XSD 等效项均无效 因为它们不是确定性的 然而 由于每个非确定性有限自动机都有一个等效的确定性有限自动机 并且存在将 NFA 转换为 DFA 的算法 那么禁止非确定性声明的原因是什么 对于这样的
  • PHP - html 隐藏输入的替代方案

    我需要以另一种形式重新发送先前 html 形式的值 以便它可以用作准备好的 SQL 语句的一部分 但是 由于潜在的安全问题 我真的不想使用 html 隐藏输入 有人知道另一种方法吗 Thanks 将值暂时保存在session 不过 隐藏的
  • 数组和结构体初始化中逗号的意义是什么? [复制]

    这个问题在这里已经有答案了 在浏览一些代码时 我遇到了这种初始化方法 include
  • 多维数组在内存中是如何格式化的?

    在 C 中 我知道我可以使用以下代码在堆上动态分配二维数组 int someNumbers malloc arrayRows sizeof int for i 0 i lt arrayRows i someNumbers i malloc
  • 获取当前gtk样式的颜色

    我使用 PyGTK 我想获取小部件的颜色 例如背景颜色 我运行这样的代码 gdkColorToRgb lambda gc gc red 257 gc green 257 gc blue 257 widget gtk HBox for exa
  • Html5 在 Firefox 中拖放鼠标位置

    我有一个使用拖放功能的 HTML5 应用程序 本质上 用户可以将图像从 抽屉 拖到画布上以创建更大的图像 我希望这些元素落在它们被释放的地方 我可以在除 Firefox 之外的所有浏览器中使用此功能 On the drop事件中 我使用以下
  • 使用写入或异步安全函数从信号处理程序打印 int

    我想使用以下命令将数字打印到日志或终端中write 或任何异步安全函数 在信号处理程序内 我不想使用缓冲 I O 有没有一种简单且推荐的方法来做到这一点 例如代替printf 下面我更喜欢write 或任何异步安全函数 void signa
  • 带有可选参数的 getopt_long() 选项

    我正在尝试使用 getopt long 创建一个带有可选参数的选项 这是我的代码 static struct option long options help no argument NULL h debug no argument NUL
  • 如何为每种产品找到合适尺寸的盒子?

    很抱歉重新上传这个问题 但我真的想要答案 请允许我再次问这个问题并希望您的支持 问题是找到合适尺寸的盒子 让物流企业在运输时节省资金 我们有两张桌子 分别是盒子和产品 盒子表包含每个盒子的 ID 和尺寸 w 代表宽度 d 代表深度 h 代表