22,209
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE GroupSeq
(
GroupItem VARCHAR(10),
Seq INT,
NAME VARCHAR(20),
)
INSERT INTO GroupSeq (GroupItem,Seq,NAME)
SELECT 'A',1,'zhao'
UNION ALL SELECT 'A',2,'qian'
UNION ALL SELECT 'A',3,'li'
UNION ALL SELECT 'B',1,'sun'
UNION ALL SELECT 'B',2,'zhou'
UNION ALL SELECT 'B',3,'wu'
UNION ALL SELECT 'C',1,'wu'
UNION ALL SELECT 'C',2,'wang'
UNION ALL SELECT 'D',1,'sun'
UNION ALL SELECT 'D',2,'zhou'
UNION ALL SELECT 'D',3,'wu'
UNION ALL SELECT 'D',4,'zheng'
UNION ALL SELECT 'E',1,'qian'
UNION ALL SELECT 'E',2,'sun'
UNION ALL SELECT 'E',3,'zheng'
--result
--1 'zhao'
--2 'qian'
--3 'sun'
--3 'li'
--4 'zhou'
--5 'wu'
--6 'zheng'
--6 'wang'
--OR
--result
--1 'zhao'
--2 'qian'
--3 'sun'
--4 'li'
--5 'zhou'
--6 'wu'
--7 'zheng'
--8 'wang'
declare @t TABLE ( Gp VARCHAR(10), Seq INT, NAME VARCHAR(20))
INSERT INTO @t (Gp,Seq,NAME)
SELECT 'A',1,'zhao'UNION ALL SELECT 'A',2,'qian'UNION ALL SELECT 'A',3,'li'
UNION ALL SELECT 'B',1,'sun'UNION ALL SELECT 'B',2,'zhou'UNION ALL SELECT 'B',3,'wu'
UNION ALL SELECT 'C',1,'wu'UNION ALL SELECT 'C',2,'wang'
UNION ALL SELECT 'D',1,'sun'UNION ALL SELECT 'D',2,'zhou'UNION ALL SELECT 'D',3,'wu'UNION ALL SELECT 'D',4,'zheng'
UNION ALL SELECT 'E',1,'qian'UNION ALL SELECT 'E',2,'sun'UNION ALL SELECT 'E',3,'zheng'
;with s as (
select name as mname,gp,seq,name,cast(gp+name as varchar(100)) as ns,1 as c from @t
union all
select mname,b.gp,b.seq,b.name,cast(ns+b.gp+b.name as varchar(100)) as ns,a.c+1 as c
from s a
inner join @t b on a.gp=b.gp and a.seq>b.seq and charindex(b.gp+b.name,a.ns)=0
union all
select mname,b.gp,b.seq,b.name,cast(ns+b.gp+b.name as varchar(100)) as ns,a.c
from s a
inner join @t b on a.gp<>b.gp and a.name=b.name and charindex(b.gp+b.name,a.ns)=0
)
select mname,max(c) as c from s group by mname order by c
/*
mname c
-------------------- -----------
zhao 1
qian 2
sun 3
li 3
zhou 4
wu 5
wang 6
zheng 6
(8 行受影响)
*/
set nocount on
CREATE TABLE px
(
G VARCHAR(10),
S INT,
NAME VARCHAR(20),
)
INSERT INTO px (G,S,NAME)
SELECT 'A',1,'zhao'
UNION ALL SELECT 'A',2,'qian'
UNION ALL SELECT 'A',3,'li'
UNION ALL SELECT 'B',1,'sun'
UNION ALL SELECT 'B',2,'zhou'
UNION ALL SELECT 'B',3,'wu'
UNION ALL SELECT 'C',1,'wu'
UNION ALL SELECT 'C',2,'wang'
UNION ALL SELECT 'D',1,'sun'
UNION ALL SELECT 'D',2,'zhou'
UNION ALL SELECT 'D',3,'wu'
UNION ALL SELECT 'D',4,'zheng'
UNION ALL SELECT 'E',1,'qian'
UNION ALL SELECT 'E',2,'sun'
UNION ALL SELECT 'E',3,'zheng'
go
create table #(id int identity,name varchar(10))
while exists(select 1 from px)
begin
insert #(name) select distinct name from px a where s=1 and not exists (select 1 from px where name=a.name and s<>1)
update px set s= s - 1 where g in (select g from px a where s = 1 and not exists(select 1 from px where name=a.name and s<>1))
delete px where name in(select name from #)
end
select * from #
drop table #
go
drop table px
/*
id name
----------- ----------
1 zhao
2 qian
3 li
4 sun
5 zhou
6 wu
7 wang
8 zheng
*/