这是指我之前提出的问题,并得到了一个非常快速的答案(max count together in an sql query)。问题集类似,但是流行问题中的解决方案会迫使我在循环中访问数据库,这会导致性能问题。所以我现在拥有的是一些加入之后:
id | description
0 | bla
0 | blub
0 | bla
1 | blablub
1 | bla
... | ...
正如你所看到的,现在id不再是主键了。我想要的是获得结果集中每个id最常用的描述。看起来应该是这样的:
id | most_popular_description | times_the_desc_appeared_for_an_id
0 | bla | 2
1 | blablub | 1
... | ... | ...
答案 0 :(得分:1)
这应该可以解决问题。
select id, description, COUNT(description)
from mytable
group by id, description
order by 3 desc
答案 1 :(得分:1)
如果您只想要最受欢迎的商品,那么我相信这应该会为您提供您正在寻找的结果集。还有其他方法可以做到这一点,但stats_mode是获取组中“最普遍”值的最简单方法(即模式)。
SELECT t.id,
t.description AS most_popular_description,
COUNT(*) AS times_the_desc_appeared_for_an_id
FROM mytable t INNER JOIN (
SELECT id, stats_mode(description) AS desc FROM mytable GROUP BY id
) a ON t.id = a.id AND t.description = a.desc
GROUP BY t.id, t.description;
请注意,嵌套查询(内联视图)是必要的,因为您还需要计数。
答案 2 :(得分:0)
我认为您可以使用dense_rank()分析函数获取每个组集的前N个。
这样的事情:
select id, description, times_the_desc_appeared_for_an_id
from
(
select id, description, count(description) times_the_desc_appeared_for_an_id
dense_rank() over (partition by id, description order by count(description) desc) position
from mytable
group by id, description
)
where
position <= 3
order by id, times_the_desc_appeared_for_an_id;