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

标签 sql-server sql-server-2008-r2

我有以下数据:

示例:

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/

相关文章:

sql - 如何在SQL中获取具有相同id的列的总和?

sql-server - 删除 SQL Server 上的所有扩展属性

sql查询同一列的差异

java - 如何使用 db=SQL Server 2008 Express 在 java 中执行批量插入语句(使用 JDBC)

sql-server-2008-r2 - 有没有办法在 SSMS 的新查询窗口中不将 Intellisense 默认为 "on"?

c# - 我如何获取 C# 程序中所有 T-SQL 保留关键字的列表

javascript - 如何从 C# 生成的 html 输入中获取多个值

sql - 如何在sql server中将列名分配给标量函数的返回值

sql-server - 如何使用分号分隔符将 Excel (xlsm) 保存为 CSV 文件?

php - 使用 PDO 和 PHP 从 SQL 表中获取最后插入记录的 id