MySQL第二种实现方式:现在有一个生产计划,甲乙丙3个品类共16个产物,生产
接上篇:链接: 现在有一个生产计划,甲乙丙3个品类共16个产物,生产时间6天,每天甲品类可以生产1张单,乙3张,丙1张,请用MySQL写出H列的效果第二种写法:
-- 使用WITH子句创建CTE
WITH initial_data AS (
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量,
ROW_NUMBER() OVER () AS original_order
FROM produces
),
scheduled_producet AS (
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量,
DATE_ADD(生产时间开始, INTERVAL FLOOR(ROW_NUMBER() OVER (PARTITION BY 品类产品 ORDER BY original_order) / 该品类每天可排单数量) DAY) AS 参照排产日期,
original_order
FROM initial_data
)
-- 查询CTE
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量, 参照排产日期
FROM scheduled_producet
ORDER BY original_order;
终极效果:
https://img-blog.csdnimg.cn/direct/e5dcbac4cb124f8b80b9db62e9e88991.png
以下是带注释的SQL代码:
-- 第一个CTE: initial_data
-- 选择表中的所有列,并为每一行分配一个顺序编号 original_order
WITH initial_data AS (
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量,
ROW_NUMBER() OVER () AS original_order
FROM produces
),
-- 第二个CTE: scheduled_producet
-- 根据品类产品进行分区,并按原始顺序 original_order 排序,计算参照排产日期
scheduled_producet AS (
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量,
DATE_ADD(生产时间开始, INTERVAL FLOOR(ROW_NUMBER() OVER (PARTITION BY 品类产品 ORDER BY original_order) / 该品类每天可排单数量) DAY) AS 参照排产日期,
original_order
FROM initial_data
)
-- 最终查询: 从 scheduled_producet 中选择所有列,并按原始顺序 original_order 排序输出
SELECT 品类产品, 生产时间开始, 生产时间结束, 该品类每天可排单数量, 参照排产日期
FROM scheduled_producet
ORDER BY original_order;
每个部分的作用如下:
initial_data CTE:为 produces 表中的每一行分配一个顺序编号 original_order,以记录原始数据的顺序。
scheduled_producet CTE:使用 ROW_NUMBER() 窗口函数按品类产物举行分区,并根据 original_order 盘算 参照排产日期。参照排产日期 的盘算基于每天可排单数目。
终极查询:从 scheduled_producet CTE 中选择所需列,并按 original_order 排序,确保输出顺序与原始数据顺序一致。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]