接上篇:链接: 现在有一个生产计划,甲乙丙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 排序,确保输出顺序与原始数据顺序一致。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |