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
页:
[1]