Кадр данных, основанный на свойстве транзитивности

У меня есть фрейм данных как

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

Я хочу вывод, который удовлетворяет переходному свойству на V1 и V2

B:    V1 V2 V3
       1  3  4   

1 ответ

Решение

Идея состоит в том, что вы выбираете один источник и пытаетесь найти транзитивность с двумя целями. если они одинаковы, то у вас правильная комбинация.

Я добавляю дополнительные столбцы для отладки, но запрос может быть упрощен немного больше.

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

ВЫХОД

Чтобы получить желаемый результат, выберите нужные столбцы и добавьте дополнительный фильтр.

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
Другие вопросы по тегам