Sql server SQL Server 2008 R2:行号()
我有以下数据: 例如: 看起来像:Sql server SQL Server 2008 R2:行号(),sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我有以下数据: 例如: 看起来像: select * from vdata; cola colb -------------- A B B C A X Z L N M O P R Z X Y T N F E G H 注意:现在我只想显示cola必须显示在colb中的数据,或者colb必须显示在cola中的数据,我想添加列以根据下一个记录中的值显示每个记录
select * from vdata;
cola colb
--------------
A B
B C
A X
Z L
N M
O P
R Z
X Y
T N
F E
G H
注意:现在我只想显示cola必须显示在colb中的数据,或者colb必须显示在cola中的数据,我想添加列以根据下一个记录中的值显示每个记录的行号
预期结果:
对上述结果的解释:第一行在开始时有行号1,并再次分配给下两个记录,因为columncola或colb中的任何一个都有值A或B。由于第四条记录没有任何值A或B,所以将第2行指定给第四条记录,并且该过程将以相同的方式继续。注意,记录7有X和Y,它的行号是1,因为它与表中第二个记录A和X相关
我的错误尝试:
表中需要某种id来建立顺序
create table #vdata
(
id int identity(1,1),
cola varchar(10),
colb varchar(10)
);
insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');
WITH Roots AS (
SELECT 1 AS level
,id
,id AS topid
,cola
,colb
FROM #vdata
UNION ALL
SELECT level + 1 AS level
,#vdata.id
,Roots.topid
,#vdata.cola
,#vdata.colb
FROM Roots
INNER JOIN #vdata
ON (#vdata.id > Roots.id)
AND (#vdata.cola = Roots.cola
OR #vdata.cola = Roots.colb
OR #vdata.colb = Roots.cola
OR #vdata.colb = Roots.colb)
)
, MaxLevel AS (
SELECT id
,topid
,DENSE_RANK() OVER (ORDER BY topid) AS RowNumbers
,cola
,colb
FROM Roots
WHERE level = (SELECT MAX(level) FROM Roots AS InnerRoots WHERE InnerRoots.id = Roots.id)
)
SELECT RowNumbers
,cola
,colb
FROM MaxLevel
ORDER BY RowNumbers
表中需要某种id来建立顺序
create table #vdata
(
id int identity(1,1),
cola varchar(10),
colb varchar(10)
);
insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');
WITH Roots AS (
SELECT 1 AS level
,id
,id AS topid
,cola
,colb
FROM #vdata
UNION ALL
SELECT level + 1 AS level
,#vdata.id
,Roots.topid
,#vdata.cola
,#vdata.colb
FROM Roots
INNER JOIN #vdata
ON (#vdata.id > Roots.id)
AND (#vdata.cola = Roots.cola
OR #vdata.cola = Roots.colb
OR #vdata.colb = Roots.cola
OR #vdata.colb = Roots.colb)
)
, MaxLevel AS (
SELECT id
,topid
,DENSE_RANK() OVER (ORDER BY topid) AS RowNumbers
,cola
,colb
FROM Roots
WHERE level = (SELECT MAX(level) FROM Roots AS InnerRoots WHERE InnerRoots.id = Roots.id)
)
SELECT RowNumbers
,cola
,colb
FROM MaxLevel
ORDER BY RowNumbers
另一种方式
create table #vdata
(
cola varchar(10),
colb varchar(10)
);
insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');
with src as
(
select row_number() over(order by cola, colb) id, cola, colb
from #vdata
)
, [matched] as
(
select s1.*
, (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
from src s1
)
, [result] as
(
select m1.*
, (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id
另一种方式
create table #vdata
(
cola varchar(10),
colb varchar(10)
);
insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');
with src as
(
select row_number() over(order by cola, colb) id, cola, colb
from #vdata
)
, [matched] as
(
select s1.*
, (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
from src s1
)
, [result] as
(
select m1.*
, (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id
如果可乐必须在colb中出现,那么为什么预期中会出现“A”output@Pradeep,请再读一遍这封信。现在我明白了。如果可乐必须在可乐中出现,那么你怎么会在预期中得到“A”output@Pradeep,请把纸条再读一遍。现在我明白了。。
create table #vdata
(
cola varchar(10),
colb varchar(10)
);
insert into #vdata values('A','B'),('B','C'),('A','X'),('Z','L'),
('N','M'),('O','P'),('R','Z'),('X','Y'),('T','N'),('F','E'),('G','H');
with src as
(
select row_number() over(order by cola, colb) id, cola, colb
from #vdata
)
, [matched] as
(
select s1.*
, (select min(s2.id) from src s2 where (s1.cola = s2.cola or s1.colb = s2.cola or s1.cola = s2.colb or s1.colb = s2.colb)) id2
from src s1
)
, [result] as
(
select m1.*
, (select m2.id2 from [matched] m2 where m2.id = m1.id2) [id3]
from [matched] m1
)
select cola, colb, dense_rank() over(order by id3) [rank]
from [result]
order by id