在MySQL中过滤和聚合多列的难度

时间:2017-08-04 10:21:49

标签: mysql group-by grouping aggregate-functions

我有一组以下格式的MySQL数据:

acode       bcode   unique_code
BA1100018    SE     OX120013
BE1100001    CS     CS140005
BE1100001    SE     SE140079
CS1400000    CS     CS140006
CS1400000    CS     CS140011
CS1400000    CS     CS140009
CS1400000    CS     CS140013
OX1100021    OX     OX110010
OX1100021    SE     OX110013
OX1100021    OX     OX980141

我正在尝试识别哪个acode id具有多个不同的bcode id。我想返回一组数据,用于过滤掉不相关的数据。在这种情况下,数据将按如下方式返回:

acode       bcode   unique_code
BE1100001    CS     CS140005
BE1100001    SE     SE140079
OX1100021    OX     OX110010
OX1100021    SE     OX110013
OX1100021    OX     OX980141

我最初的尝试是:

select count(bcode),acode from mydataset group by acode having 
count(bcode)>1

我意识到这不会让我回到bcodes,所以我尝试了各种各样的排列。没有太大的成功。我一直在尝试尽可能高效地完成这项工作,因为我正在处理大型数据集,但是在维护我需要的细节的同时,我在使用聚合技术时遇到了困难。有人能帮忙吗?感谢

3 个答案:

答案 0 :(得分:0)

如果你告诉我们你尝试了什么,那就更好了。

SELECT acode,bcode,count(bcode)
FROM mydataset
GROUP BY acode,bcode

如果您只想要那些超过1

的那些
SELECT acode,bcode,count(bcode) as num
FROM mydataset
GROUP BY acode,bcode
HAVING num>1

答案 1 :(得分:0)

SELECT DISTINCT x.*
           FROM my_table x 
           JOIN my_table y 
             ON y.acode = x.acode 
            AND y.bcode <> x.bcode;

答案 2 :(得分:0)

这对你有用

SELECT main.bcode, main.acode FROM mydataset main 
INNER JOIN (SELECT acode, count(DISTINCT bcode) AS cnt FROM mydataset GROUP BY acode HAVING cnt>1) AS sub
ON main.acode=sub.acode