下面是我在一个表中的记录示例。EntriesPerSet
列包含该SET_ID
在表中的记录数。我需要在属于不同SET_ID
s的行之间建立等价性。集合是等价的,当且仅当它们每个集合包含相等数量的条目,并且每个条目在另一个集合中都有相应的条目(通过检查K1
和K2
中的值)。在以下情况下,SET_IDs
1和2是等效的。
SET_ID K1 K2 EntriesPerSet
1 a b 4
1 c d 4
1 e f 4
1 g h 4
2 a b 4
2 c d 4
2 e f 4
2 g h 4
3 a b 5
3 c d 5
3 e f 5
3 g h 5
3 i j 5
4 a b 3
4 c d 3
4 e f 3
5 a b 4
5 c d 4
5 e f 4
5 p q 4
请帮我怎么做。谢谢
如果你只想知道哪些对是等价的,你可以使用一个公共表表达式来获得所有可能的组合,并使用INTERSECT
来计算它们中的哪些完全重叠;
WITH cte AS (
SELECT DISTINCT a.SET_ID aid, b.SET_ID bid, a.EntriesPerSet
FROM mysets a
JOIN mysets b ON a.EntriesPerSet = b.EntriesPerSet AND a.SET_ID < b.SET_ID
)
SELECT aid, bid FROM cte
WHERE EntriesPerSet = (
SELECT COUNT(*) FROM (
SELECT K1,K2 FROM mysets WHERE SET_ID=aid
INTERSECT
SELECT K1,K2 FROM mysets WHERE SET_ID=bid
) a
)
要测试的SQLfiddle。