【问题标题】:SQL Server 2008R2 from Table to edges for GraphSQL Server 2008R2 从表到图边
【发布时间】:2016-08-12 05:40:36
【问题描述】:

我偶然发现了一个有趣的挑战。我的 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

我怀疑这部分可以通过枢轴/取消枢轴实现,但不知道如何继续将枢轴限制为仅两列。

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

【问题讨论】:

    标签: sql-server tsql graph sql-server-2008-r2 sql-graph


    【解决方案1】:

    您可以使用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`
    ╚═══════╩═══════╝
    

    注意:

    要获得稳定的排序,您需要添加列,该列将指示组内具有相同date 的顺序。我使用了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 ║
    ╚═══════╩═══════╝
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多