Кадр данных, основанный на свойстве транзитивности
У меня есть фрейм данных как
A: V1 V2
1 3
1 4
3 4
1 6
6 5
Я хочу вывод, который удовлетворяет переходному свойству на V1 и V2
B: V1 V2 V3
1 3 4
1 ответ
Решение
Идея состоит в том, что вы выбираете один источник и пытаетесь найти транзитивность с двумя целями. если они одинаковы, то у вас правильная комбинация.
Я добавляю дополнительные столбцы для отладки, но запрос может быть упрощен немного больше.
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