接上篇:链接: 现在有一个生产计划,甲乙丙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;
最终结果:
以下是带注释的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 排序,确保输出顺序与原始数据顺序一致。