我有以下数据:
示例:
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');
看起来像:
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
中的数据 OR colb
必须出现在 cola
中,我想添加列以根据下一个中存在的值显示每个记录的行号记录。
预期结果:
RowNumbers cola colb
------------------------
1 A B
1 A X
1 B C
2 N M
3 R Z
2 T N
1 X Y
3 Z L
上述结果的解释:第一行的行号为 1
并再次分配给接下来的两条记录,因为 column(cola or colb)
有值 A 或 B
所以。给予第四条记录的行号 2
因为它没有任何值 A 或 B
并且将继续以相同的方式处理。并注意记录 7 有 X 和 Y
它的行号是 1
因为它与表中第 2 条记录的 A
相关 A 和 X
。
我的失败尝试:
SELECT
row_number() over(PARTITION BY cola order by cola) RowNumbers,
cola,
colb
FROM vdata
where cola in (select colb from vdata)
or colb in (select cola from vdata)
ORDER BY cola,colb
最佳答案
您需要表中的某种 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
关于sql-server - SQL 服务器 2008 R2 : ROW_NUMBER(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26733152/