如何:对项目进行分组,检索组的一个(随机)行数据,并在一个SQL子句中计算每个组中的行数

时间:2012-07-12 12:40:30

标签: sql oracle

我在数据库中有简单的表,其中包括列error_id,error_group_id和message。我想在UI中显示列表,其中显示了每个错误组的消息和出现次数。

错误消息可能略有不同(例如:设置X在日期过期),其中日期可能会发生变化,但是error_group_id(来自定义常量的散列,希望用于分组)不会改变(例如,可能是(AssemblyName +“设置已过期”)。GetHashCode()。

目前我可以列出包含消息的组:

 SELECT message, error_group_id
 FROM (SELECT error_id, message, error_group_id,
 rank() OVER ( PARTITION BY error_group_id ORDER BY error_id) rank
 FROM cc_errors)
 WHERE rank <= 1;

输出: (只选择一个随机的)消息,组哈希。 (每组只有一次)。

但是,我想了解有关组内有多少个别错误消息的信息(双击组打开窗口,其中显示了各个错误的列表)。我想计算这个SQL子句中每个组的出现次数。

所以想要输出跟随(每组单行):

消息,组散列,组内消息计数。

Project正在使用oracle作为数据库。

有人可以帮忙解决这个问题:P

2 个答案:

答案 0 :(得分:5)

您可以在当前查询中添加COUNT

SELECT message, error_group_id, cnt
  FROM (SELECT error_id,
               message,
               error_group_id,
               rank() OVER (PARTITION BY error_group_id ORDER BY error_id) rank,
               count(*) OVER (PARTITION BY error_group_id) cnt
          FROM cc_errors)
 WHERE rank <= 1;

答案 1 :(得分:0)

我认为你只是在寻找group by

 select distinct c.message, c.error_group_id, t.error_group_count
   from cc_errors c
           inner join
        (select error_group_id, count(*) as error_group_count
           from cc_errors
          group by error_group_id) t  on t.error_group_id = c.error_group_id

这会返回您要求的内容,但似乎没有意义。我这样做:返回包含组ID的所有邮件,然后当您点击组ID时,执行select count(*) from cc_errors where error_group_id = @groupId