为每个类别选择最常用的项目

时间:2014-03-28 12:59:23

标签: sql sqlite

我表格中的每一行都属于类别,有一些和其他数据。

我想为每个类别选择最常见的(如果有多个,则无关紧要),由类别

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是否能以合理的性能做到这一点。

3 个答案:

答案 0 :(得分: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;

最常见值的名称是" mode"在统计数据中。

而且,如果您有一个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;

答案 1 :(得分: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

答案 2 :(得分:-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是否会离开第一个并且无法测试但恕我直言它应该可以使用