2017-08-22 122 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