我已经看过许多类似的问题,但是还没有能够将它们应用到我的情况中。我已经花了很多时间努力解决这个问题,所以我感谢任何帮助你的人。
背景 我有两个输入属性的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,但实际上已经完全失败了。
答案 0 :(得分:0)
如果我理解正确,您可以使用子查询来查找最常出现的input1
和input2
的相应值。然后,您可以加入此信息并重新聚合:
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语句进行分组以获取计数。