如果有人可以验证我的 SQL 查询,我将非常感激。
对于以下数据集:
MD5 UserPK CategoryPK
ADCDE 1 7
ADCDE 1 4
ADCDE 1 7
dffrf 1 7
dffrf 2 7
dffrf 2 6
dffrf 1 1
我想选择 MD5 和 CategoryPK,其中存在两行或更多行具有相同的 MD5 值、相同的 CatgegoryPK 和两个或更多不同的 UserPK 值。
换句话说,我想知道两个或多个不同用户(UserPK)将相同类别(UserPK)分配给同一文件(Md5)的所有记录的MD5和categoryPK。我对同一用户多次分配类别的记录不感兴趣(除非不同的用户也向该文件分配相同的类别)。
所以从上面的数据来看,我只想返回:
md5 CategoryPK
dffrf 7
我写的查询是:
SELECT md5,
count(md5),
count(distinct categorypk) as cntcat,
count(distinct userpk) as cntpk
FROM Hash
group by md5 having count(md5) > 1
and cntpk > 1
and cntcat = 1;
它似乎有效,但在我开始愤怒地使用它之前,如果我错过了一些东西或者是否有更好的方法,我会很感激第二个意见。
Thanks
我不认为你的代码会给你你想要的东西;当多个用户为一个文件分配了多个类别且某些类别重叠时,会发生什么情况?然后cntcat != 1
,所以你的HAVING
即使文件确实被多个用户以相同的方式分类,子句也将无法匹配。
我会使用自连接:
SELECT a.MD5, a.CategoryPK
FROM Hash a
JOIN Hash b
ON a.MD5 = b.MD5
AND a.UserPK <> b.UserPK
AND a.CategoryPK = b.CategoryPK
GROUP BY a.MD5, a.CategoryPK
HAVING COUNT(DISTINCT a.UserPK) > 2 -- you said "more than 2" ?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)