2014-03-28 68 views
0

我表中的每一行都屬於類別,有一些等數據。爲每個類別選擇最常見的項目

我想選擇每個類別最常見它(如果有多個無所謂哪一個),由類別排序。

some_table:    expected result: 
+--------+-----+---  +--------+-----+ 
|category|value|...  |category|value| 
+--------+-----+---  +--------+-----+ 
| 1 | a |  | 1 | a | 
| 1 | a |  | 2 | b | 
| 1 | b |  | 3 | a # or b 
| 2 | a |  +--------+-----+ 
| 2 | b | 
| 2 | c | 
| 2 | b | 
| 3 | a | 
| 3 | a | 
| 3 | b | 
| 3 | b | 
+--------+-----+--- 

我有一個解決方案(張貼作爲一個答案),但它似乎不理想給我。所以我正在尋找更好的解決方案。

我的表格最多有10000行(可能,但不太可能,除此之外)。

我打算使用SQLite,但我沒有綁定到它,所以我可能會重新考慮,如果SQLite不能以合理的性能做到這一點。

回答

1

我會傾向於做這個使用相關子查詢:

select distinct category, 
     (select value 
     from some_table t2 
     where t2.category = t.category 
     group by value 
     order by count(*) desc 
     limit 1 
     ) as mode_value 
from some_table t; 

的名稱最常見的值在統計「模式」。

而且,如果你有一個categories表,這將被寫成:

select category, 
     (select value 
     from some_table t2 
     where t2.category = c.category 
     group by value 
     order by count(*) desc 
     limit 1 
     ) as mode_value 
from categories c; 
0

這是一種選擇,但我認爲這是慢......

SELECT DISTINCT `category` AS `the_category`, `value` 
FROM `some_table` 
WHERE `value`=(
    SELECT `value` 
    FROM `some_table` 
    WHERE `category`=`the_category` 
    GROUP BY `value` 
    ORDER BY COUNT(`value`) DESC LIMIT 1) 
ORDER BY `category`; 

您可以WHERE `id`=( SELECT `id`替換其中的一部分,如果該表具有唯一/主鍵列,則不需要LIMIT 1

+0

子查詢可以是可能是加入?會增加速度嗎? – Rahul

+0

@Rahul我不知道。我是這個新手。 –

-1
select category, value, count(*) value_count 
from some_table t 
group by category, value 
order by category, value_count DESC; 

返回我們每個值的大寫金額在每個類別

select category, value 
from (
    select category, value, count(*) value_count 
    from some_table t 
    group by category, value) sub 
group by category 

其實我們需要的第價值,因爲它是排序的。

我不知道SQLite的離開第一個,不能測試但恕我直言它應該工作

+0

結果中的值不是最常見的值。 –