sql-server - SQL Server 2008R2 从表到图的边

标签 sql-server t-sql graph sql-server-2008-r2 sql-graph

我偶然发现了一个有趣的挑战。我的 SQL Server 表中有以下格式/内容的数据。

Date     | Name
---------+---------
1/1/2010 | John
1/1/2010 | Mark
1/1/2010 | Peter
1/1/2010 | Mia
2/4/2010 | John
2/4/2010 | Billy

我正在尝试将该表转换为包含图形边缘的文件。

我需要边缘文件来包含列以及表格显示的所有组合。

John | Mark
John | Peter
John | Mia
Mark | Mia
Mark | Peter
Peter | Mia
John | Billy

我怀疑部分内容可以通过透视/逆透视来实现,但不知道如何继续将透视限制为仅两列。

此外,我不知道如何确保获得所有可能的节点组合,请注意前四个“节点”需要变成六个“边”。

最佳答案

您可以使用ROW_NUMBER和“三角形连接”:

WITH cte AS
(
  SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY date ORDER BY Name)
  FROM tab
)
SELECT c.Name, c2.Name
FROM cte c
JOIN cte c2
  ON c.Date = c2.Date
  AND c.rn < c2.rn;

LiveDemo

输出:

╔═══════╦═══════╗
║ Name  ║ Name  ║
╠═══════╬═══════╣
║ John  ║ Mark  ║
║ John  ║ Mia   ║
║ John  ║ Peter ║
║ Mark  ║ Mia   ║
║ Mark  ║ Peter ║
║ Mia   ║ Peter ║      -- ORDER BY based on `Name`
║ Billy ║ John  ║      -- same here `B` before `J`
╚═══════╩═══════╝

注意:

为了获得稳定的排序,您需要添加列来指示具有相同日期的组内的顺序。我使用了 Name 但它交换了最后两行中的名称。


带有 ID 列的版本:

CREATE TABLE tab(ID INT IDENTITY(1,1)
                 ,Date DATE  NOT NULL 
                 ,Name VARCHAR(6) NOT NULL);

INSERT INTO tab(Date,Name) 
VALUES ('1/1/2010','John'), ('1/1/2010','Mark'), ('1/1/2010','Peter')
      ,('1/1/2010','Mia'), ('2/4/2010','John'),('2/4/2010','Billy');

WITH cte AS
(
  SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY date ORDER BY ID)
  FROM tab
)
SELECT c.Name, c2.Name
FROM cte c
JOIN cte c2
  ON c.Date = c2.Date
  AND c.rn < c2.rn;

LiveDemo 2

输出:

╔═══════╦═══════╗
║ Name  ║ Name  ║
╠═══════╬═══════╣
║ John  ║ Mark  ║
║ John  ║ Peter ║
║ John  ║ Mia   ║
║ Mark  ║ Peter ║
║ Mark  ║ Mia   ║
║ Peter ║ Mia   ║
║ John  ║ Billy ║
╚═══════╩═══════╝

关于sql-server - SQL Server 2008R2 从表到图的边,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36728633/

相关文章:

c# - GroupBy 与 EF Core 6.0 和 SQL Server

sql-server - 连接两个表中的数据

algorithm - 树中边的反证法

sql - 动态 SQL 传递表名并返回最大 ID 值

Python图形工具通过索引有效地访问顶点属性

基于循环图中先前节点查找节点成本的算法

sql - SSIS 中的源代码控制和 dtsx 文件的并发工作

sql - 从表中选择层次结构

sql-server - 具有多个 JOINS 的复杂选择逻辑

sql-server-2008 - 对表值函数 tvf 执行一系列联合语句的非动态方法