2017-08-22 74 views
-1

传递性质我有作为数据帧的基础上

A: V1 V2 
     1 3  
     1 4  
     3 4  
     1 6 
     6 5 

我想输出的数据帧满足于V1和V2

B: V1 V2 V3 
     1 3 4 
+1

这是什么逻辑?为什么没有'{1,6,5}' –

+0

因为没有{1,5} – user2999110

回答

0

传递特性的想法是选择一个来源,并尝试找到两个目标的传递性。如果那些是相同的,那么你有正确的组合。

我为调试目的添加了额外的列,但查询可以简化一点点。

SQL DEMO

SELECT * 
FROM (
     SELECT source.[V1], source.[V2], 
       target1.[V1] as t1_v1, 
       target1.[V2] as t1_v2, 
       target2.[V1] as t2_v1, 
       target2.[V2] as t2_v2, 
       CASE WHEN source.[V1] = target1.[V1] 
        THEN target1.[V2] 
        ELSE target1.[V1] 
       END as transitive1, 
       CASE WHEN source.[V2] = target2.[V2] 
        THEN target2.[V1] 
        ELSE target2.[V2] 
       END as transitive2  
     FROM A as source 
     JOIN A as target1 
      ON  (source.[V1] = target1.[V1] OR source.[V1] = target1.[V2]) 
      AND NOT (source.[V1] = target1.[V1] AND source.[V2] = target1.[V2]) 
     JOIN A as target2  
      ON  (source.[V2] = target2.[V1] OR source.[V2] = target2.[V2]) 
      AND NOT (source.[V1] = target2.[V1] AND source.[V2] = target2.[V2]) 
    ) T 
WHERE T.transitive1 = T.transitive2 

输出

enter image description here

为了得到你想要选择正确的列,并添加aditional的过滤结果

SELECT T.[V1] as [V1], 
     T.[V2] as [V2], 
     T.[transitive1] as [V3] 

.... 

WHERE T.[V1] > T.[V2] 
    AND T.[V2] > T.[transitive1] 
    AND T.transitive1 = T.transitive2