2015-10-19 66 views
1

我見過很多類似的問題,但無法將它們應用於我的情況。我花了很多時間在這方面掙扎,所以我很感謝你們任何人的幫助都可以借給我。在MySQL中具有最高計數輸入的子查詢

背景: 我有關係的兩個輸入的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,但實際上完成任何工作都不成功。

+1

MySQL和/或MS SQL Server?不要標記不涉及的產品... – jarlh

回答

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; 
+0

這是完美的!馬上開始工作。多謝! – Lewis

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語句分類您的輸入,然後組得到計數。

+0

我並沒有真正知道設置中的值,否則你的答案可能已經奏效。與Gordon一起去了 - 但感謝您的幫助和非常迅速的回覆 – Lewis