1

我如何能够在一个 oracle 查询中为几个组提供 N 个结果。

有关示例,请参见下表:

    ID  Team    Auditor
    1   Tm1     Jill
    2   Tm2     Jill
    3   Tm1     Jill
    4   Tm2     Jack
    5   Tm2     Jack
    6   Tm2     Jack
    7   Tm3     Sam
    8   Tm1     Sam
    9   Tm5     Sam

有更多的行有更多的审计员和团队。我想为每个审核员安排 3 个团队,尽可能由 3 个不同的团队组成。

我已经在使用以下 SQL(针对此查询Get top results for each group (in Oracle)发布)为每个审计员返回 3 个团队,但有时他们会得到 3 个相同的团队,这并不理想(请参阅杰克)。

select * 
  from (select ID, 
               Team, 
               Auditor, 
               rank() over ( partition by Auditor order by ID) rank 
          from table) 
 where rank <= 3;
4

1 回答 1

1

您的测试数据不包括您解释的情况。

你可以这样做:

select * 
from(
    select ID, 
           Team,
           Auditor,
           row_number() over (partition by Auditor order by rank1) as rank
      from (select ID, 
                   Team, 
                   Auditor, 
                   row_number() over (partition by Auditor, team order by id) rank1 
              from table) 
      )
where rank <= 3;

然而,这会更贵,因为你有两种。

内部查询以 Auditor、Team 的第一个组合排名第一,第二个排名为 2,依此类推。

中间查询将 Auditor 行排在内部排名之后,因此 Auditor 将具有不同团队的第一行。

外部查询获取每个审计员的前三行。

于 2012-05-01T11:35:26.363 回答