我表格中的每一行都属于类别,有一些值和其他数据。
我想为每个类别选择最常见的值(如果有多个,则无关紧要),由类别
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是否能以合理的性能做到这一点。
答案 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是否会离开第一个并且无法测试但恕我直言它应该可以使用