J'ai un cadre de donnéescadre de données basé sur la propriété de transitivité de
A: V1 V2
1 3
1 4
3 4
1 6
6 5
Je veux sortie qui satisfait la propriété transitive sur V1 et V2
B: V1 V2 V3
1 3 4
J'ai un cadre de donnéescadre de données basé sur la propriété de transitivité de
A: V1 V2
1 3
1 4
3 4
1 6
6 5
Je veux sortie qui satisfait la propriété transitive sur V1 et V2
B: V1 V2 V3
1 3 4
L'idée vous est de choisir une source et essayer pour trouver la transitivité avec deux cibles. Si ce sont les mêmes, alors vous avez la bonne combinaison.
J'ajoute des colonnes supplémentaires à des fins de débogage, mais la requête peut être simplifiée un peu plus.
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
SORTIE
Pour obtenir le résultat que vous voulez sélectionner les colonnes de droite et ajouter le filtre 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
Quelle est la logique ici? Pourquoi il n'y a pas {1, 6, 5} ' –
Parce qu'il n'y a pas {1,5} – user2999110