MySQL中具有最高计数输入的子查询

时间:2015-10-19 14:41:59

标签: mysql sql subquery

我已经看过许多类似的问题,但是还没有能够将它们应用到我的情况中。我已经花了很多时间努力解决这个问题,所以我感谢任何帮助你的人。

背景 我有两个输入属性的Mosaic Plot映射计数频率,我试图用数据驱动它们。数据源自mysql语句。还有一些简单的过滤应用。使用我正在使用的数据集,有很多小值,因此数据有点 - 很混乱。

目标:我的目标是从每个输入中获取最常出现的N个项目,然后将剩余的项目归结为"其他"完事。 (最坏情况下降)。我相当肯定我必须使用复杂的子查询才能做到这一点。但是,我很难完全围绕子查询语法。

注意: 我可以处理产生计数或非计数的SQL结果,但由于性能限制和工作涉及按摩,可能更喜欢基于计数的输出它以后。

Example:   N=2
input1    input2
a           w
a           w
b           w
b           w
b           w
c           x
d           x
b           y
a           z

Output #1 (Preferred):
input1     input2    count
a           w          2
b           w          3
other       x          2
b           other      1
a           other      1

or 

Output #2:
input1     input2    
a           w
a           w
b           w
b           w
b           w
other       x
other       x
b           other
a           other

这是我的原始查询:

SELECT input1,input2 from `table` 
where attr3 != 'aaa'
and attr4 != 'bbb'
and attr5 != 'ccc'
and attr6 != 'ddd'

我已经能够修改它以返回子查询中使用...

SELECT input1,count(*) FROM `table`
where attr3 != 'aaa'
and attr4 != 'bbb'
and attr5 != 'ccc'
and attr6 != 'ddd'
GROUP BY input1
ORDER BY count(*) DESC
LIMIT 2

从这里开始,我已尝试使用LEFT JOIN语法和UNION,但实际上已经完全失败了。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以使用子查询来查找最常出现的input1input2的相应值。然后,您可以加入此信息并重新聚合:

select coalesce(i1.input1, 'other') as input1,
       coalesce(i2.input2, 'other') as input2,
       count(*)
from t left join
     (select input1, count(*) as cnt
      from t
      group by input1
      order by cnt desc
      limit 2
     ) i1
     on t.input1 = i1.input1 left join
     (select input2, count(*) as cnt
      from t
      group by input2
      order by cnt desc
      limit 2
     ) i2 
     on t.input2 = i2.input2
group by i1.input1, i2.input2;

答案 1 :(得分:0)

SELECT (CASE WHEN input1 NOT IN ('a','b') THEN 'other' ELSE input1 END) as input1,
(CASE WHEN input2 NOT IN ('a','b') THEN 'other' ELSE input2 END) as input2,
COUNT(*) AS Cnt
FROM myTable
GROUP BY (CASE WHEN input1 NOT IN ('a','b') THEN 'other' ELSE input1 END),(CASE WHEN input2 NOT IN ('a','b') THEN 'other' ELSE input2 END)

使用case语句对输入进行分类,然后按这些case语句进行分组以获取计数。