sql server 数据集分组,每组数据内部进行排序、过滤

 

/*
这是一个用于筛选特定生产工单相关数据的SQL脚本,分为公共表表达式(CTE)和临时表创建两部分 
*/
 
-- 步骤1:定义公共表表达式(CTE)用于数据排序 
WITH RankedData AS (
   SELECT 
      MO.ACTUAL_COMPLETE_DATE,       -- 工单实际完成日期 
     MITEM.ITEM_CODE AS MItemCode,   -- 主物料的编码(来自MO表关联的ITEM表)
     CITEM.ITEM_CODE AS CItemCode,   -- 子物料的编码(来自MO_D表关联的ITEM表)
     MO_D.ISSUED_QTY AS 领料数,       -- 物料发放数量 
     MO.COMPLETED_QTY AS 入库,        -- 工单完成数量 
     -- 按物料组合的最新日期生成行号(用于后续筛选最近3条记录)
     ROW_NUMBER() OVER (
       PARTITION BY MITEM.ITEM_CODE, CITEM.ITEM_CODE  -- 按主/子物料组合分区 
       ORDER BY MO.ACTUAL_COMPLETE_DATE DESC         -- 按完成日期倒序排列 
      ) AS RowNum 
   FROM MO    -- 主工单表
   -- 关联主物料信息 
   JOIN ITEM MITEM ON MITEM.ITEM_BUSINESS_ID = MO.ITEM_ID 
   -- 左联工单明细表(允许空值)
   LEFT JOIN MO_D ON MO.MO_ID = MO_D.MO_ID 
   -- 关联子物料信息(必须存在)
   JOIN ITEM CITEM ON MO_D.ITEM_ID = CITEM.ITEM_BUSINESS_ID 
   WHERE MO.ACTUAL_COMPLETE_DATE < @StartDate  -- 筛选指定日期前的记录 
   and LEFT(CITEM.ITEM_CODE ,1) != '1' -- 排除子物料编码以1开头(返工工单)
   and LEFT(CITEM.ITEM_CODE ,1) != '3' -- 排除子物料编码以3开头(成型工单)
   and LEFT(CITEM.ITEM_CODE ,1) != '4' -- 排除子物料编码以4开头(成型工单)
)
 
-- 步骤2:将筛选结果存入临时表
SELECT 
   MItemCode,     -- 主物料编码 
   CItemCode,     -- 子物料编码 
   领料数,         -- 发放数量 
   入库           -- 完成数量 
INTO #temp       -- 创建临时表存储结果 
FROM RankedData 
WHERE RowNum <= 3  -- 取每个物料组合的最新3条记录 
ORDER BY MItemCode -- 按主物料编码排序 
 
/* 
业务逻辑说明:
1. 该查询通过多层关联,获取主工单(MO)与子物料(MO_D)的关联关系 
2. 通过ROW_NUMBER实现按日期倒序的Top3数据筛选 
3. 过滤条件排除特定类型的生产工单:
   - 以1开头的编码:返工工单
   - 以3/4开头的编码:成型工单 
4. 最终结果用于分析近期物料发放与工单完成的对应关系 
*/

  

来源链接:https://www.cnblogs.com/1810739137qq/p/18797274

© 版权声明
THE END
支持一下吧
点赞10 分享
评论 抢沙发
头像
请文明发言!
提交
头像

昵称

取消
昵称表情代码快捷回复

    暂无评论内容