SQL - 比较组是唯一的
SQL - comparing groups to be unique
我正在尝试检查我在 'group by' 子句中创建的集合的唯一性。
假设我有一个名为 RelevantKeys 的 table:
KeyID | KeyValue | MainID
1 | a | C1
1 | a | C2
1 | a | C3
2 | b | C1
2 | b | C2
2 | a | C3
KeyIDs 和它们的值形成了类似于复合键的东西来标识 MainId。我想检查是否存在重复项。
在上面的示例中,预期答案为真,因为 C1 和 C2 的所有 KeyId 都具有相同的 KeyValues:
C1,C2: (a,b)
C4: (a,a)
但是,我希望对以下内容给出否定答案 - 例如如果它们不共享值的全部组成,则在第一个索引中共享相同的值不算重复。
KeyID | KeyValue | MainID
1 | a | C1
1 | a | C3
2 | b | C1
2 | a | C3
分组似乎合乎逻辑,但我不知道如何检查所有组中所有行的唯一性。聚合函数不起作用,因为我需要比较整个组,而不仅仅是每个组中的行。
SELECT R.MainID
FROM RelevantKeys R
GROUP BY R.MainID
我怎样才能做到这一点?注意KeyID的个数不固定
感谢您的帮助!
Select keyId, keyvalue, count(distinct mainID)
from RelevantKeys
group by keyId, keyvalue
Having count(distinct mainId) > 1
您可以使用 EXCEPT 检查一组中存在的记录,而不是另一组中的记录。通过使用两次这样的检查,您可以确保一组中的所有记录都与另一组中的所有记录相匹配。以下列出了所有键及其匹配项:
with mainKeys (MainId) as
(
select distinct MainId
from RelevantKeys
)
select k1.MainId as MainId1, k2.MainId as MainId2
from MainKeys k1
cross join MainKeys k2
where k1.MainId != k2.MainId
and not exists
(
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k1.MainId
except
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k2.MainId
)
and not exists
(
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k2.MainId
except
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k1.MainId
)
请注意,对于每个匹配项,都会返回两行,每个 MainId。此外,这假设顺序无关紧要,并且没有 key/value 对在 MainId 组中重复。
我正在尝试检查我在 'group by' 子句中创建的集合的唯一性。
假设我有一个名为 RelevantKeys 的 table:
KeyID | KeyValue | MainID
1 | a | C1
1 | a | C2
1 | a | C3
2 | b | C1
2 | b | C2
2 | a | C3
KeyIDs 和它们的值形成了类似于复合键的东西来标识 MainId。我想检查是否存在重复项。
在上面的示例中,预期答案为真,因为 C1 和 C2 的所有 KeyId 都具有相同的 KeyValues:
C1,C2: (a,b)
C4: (a,a)
但是,我希望对以下内容给出否定答案 - 例如如果它们不共享值的全部组成,则在第一个索引中共享相同的值不算重复。
KeyID | KeyValue | MainID
1 | a | C1
1 | a | C3
2 | b | C1
2 | a | C3
分组似乎合乎逻辑,但我不知道如何检查所有组中所有行的唯一性。聚合函数不起作用,因为我需要比较整个组,而不仅仅是每个组中的行。
SELECT R.MainID
FROM RelevantKeys R
GROUP BY R.MainID
我怎样才能做到这一点?注意KeyID的个数不固定
感谢您的帮助!
Select keyId, keyvalue, count(distinct mainID)
from RelevantKeys
group by keyId, keyvalue
Having count(distinct mainId) > 1
您可以使用 EXCEPT 检查一组中存在的记录,而不是另一组中的记录。通过使用两次这样的检查,您可以确保一组中的所有记录都与另一组中的所有记录相匹配。以下列出了所有键及其匹配项:
with mainKeys (MainId) as
(
select distinct MainId
from RelevantKeys
)
select k1.MainId as MainId1, k2.MainId as MainId2
from MainKeys k1
cross join MainKeys k2
where k1.MainId != k2.MainId
and not exists
(
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k1.MainId
except
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k2.MainId
)
and not exists
(
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k2.MainId
except
select KeyId, KeyValue
from RelevantKeys r
where r.MainId = k1.MainId
)
请注意,对于每个匹配项,都会返回两行,每个 MainId。此外,这假设顺序无关紧要,并且没有 key/value 对在 MainId 组中重复。