在SQL查询中最大计数2

时间:2009-04-27 05:49:18

标签: sql oracle10g

这是指我之前提出的问题,并得到了一个非常快速的答案(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
... |                      ... |                               ...

3 个答案:

答案 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;