gpt4 book ai didi

sql-server - SQL 服务器 2008 R2 : ROW_NUMBER()

转载 作者:行者123 更新时间:2023-12-02 17:36:07 25 4
gpt4 key购买 nike

我有以下数据:

示例:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com