22,210
社区成员
发帖
与我相关
我的任务
分享
WITH CTE AS(
SELECT
ROW_NUMBER()OVER(ORDER BY BOMID,[排序字段])RN
,ROW_NUMBER()OVER(PARTITION BY [工艺代码] ORDER BY BOMID,[排序字段])RN2
,BOMID,[工艺代码],[排序字段],ID
FROM 表A
)
,CTE2 AS(
SELECT ROW_NUMBER()OVER(PARTITION BY BOMID,[工艺代码],RN-RN2 ORDER BY BOMID,[排序字段])RN,BOMID,[工艺代码],[排序字段],ID,RN-RN2 RN12 FROM CTE
)
,CTE3 AS(
SELECT ROW_NUMBER()OVER(ORDER BY BOMID,[排序字段])RN,BOMID,[工艺代码],[排序字段],RN12 FROM CTE2 WHERE RN=1
)
SELECT
A.BOMID,A.[工艺代码],A.[排序字段],A.ID,B.RN GroupID
FROM
CTE2 A
LEFT JOIN CTE3 B ON A.BOMID=B.BOMID AND A.[工艺代码]=B.[工艺代码] AND A.RN12=B.RN12
ORDER BY A.BOMID,B.[排序字段]
--结果
id gno ono rid lid groupid
----------- ----------- ----------- -------------------- -------------------- --------------------
99055 1 7 1 1 1
99055 2 13 2 1 2
99055 4 34 3 1 3
99055 4 43 4 2 3
99055 4 67 5 3 3
99055 8 70 6 1 4
99055 7 82 7 1 5
99055 9 94 8 1 6
99055 4 97 9 4 4
104998 1 1 1 1 1
104998 2 2 2 1 2
104998 4 3 3 1 3
104998 4 4 4 2 3
104998 10 5 5 1 5
104998 4 6 6 3 4
(15 行受影响)
;with acherat as
(
select *,rid=row_number() over (partition by bomid order by 排序字段),
lid=row_number() over (partition by bomid,工艺代码 order by 排序字段)
from cte1
)
select *,groupid = dense_rank() over (partition by bomid order by lid - rid)
from acherat
大版主 你这个用法没见过。
我测试了 结果是这个
[code=sql]
id gno ono rid groupid
----------- ----------- ----------- -------------------- --------------------
99055 1 7 1 1
99055 2 13 2 2
99055 4 34 3 3
99055 4 43 4 4
99055 4 67 5 5
99055 8 70 6 6
99055 7 82 7 7
99055 9 94 8 8
99055 4 97 9 9
104998 1 1 1 1
104998 2 2 2 1
104998 4 3 3 1
104998 4 4 4 1
104998 10 5 5 1
104998 4 6 6 1
(15 行受影响)
;with acherat as
(
select *,rid=row_number() over (partition by bomid order by 排序字段)
from a
)
select *,groupid = dense_rank() over (partition by bomid order by 排序字段 - rid)
from acherat
;with acherat as
()
with cte as
(select 99055 as id,1 gno, 7 ono union all
select 99055 as id,2 gno, 13 ono union all
select 99055 as id,4 gno, 34 ono union all
select 99055 as id,4 gno, 43 ono union all
select 99055 as id,4 gno, 67 ono union all
select 99055 as id,8 gno, 70 ono union all
select 99055 as id,7 gno, 82 ono union all
select 99055 as id,9 gno, 94 ono union all
select 99055 as id,4 gno, 97 ono union all
select 104998 as id,1 gno, 1 ono union all
select 104998 as id,2 gno, 2 ono union all
select 104998 as id,4 gno, 3 ono union all
select 104998 as id,4 gno, 4 ono union all
select 104998 as id,10 gno, 5 ono union all
select 104998 as id,4 gno, 6 ono ),
cte1 as
(select *,ROW_NUMBER()over(partition by id order by ono) as n from cte),
cte2 as
(select * ,1 as groupid from cte1 where n=1
union all
select a.*,case when a.gno=b.gno then b.groupid
else b.groupid+1 end as groupid from cte1 as a join cte2 as b
on a.n=b.n+1 and a.id=b.id )
select * from cte2
order by id,ono
--结果
id gno ono n groupid
----------- ----------- ----------- -------------------- -----------
99055 1 7 1 1
99055 2 13 2 2
99055 4 34 3 3
99055 4 43 4 3
99055 4 67 5 3
99055 8 70 6 4
99055 7 82 7 5
99055 9 94 8 6
99055 4 97 9 7
104998 1 1 1 1
104998 2 2 2 2
104998 4 3 3 3
104998 4 4 4 3
104998 10 5 5 4
104998 4 6 6 5
(15 行受影响)