4

我有一个 Oracle 11g 表,如下所示:

id  name    department
1   John    Accounting
2   Frederick   BackOffice
3   Erick   Accounting
4   Marc    BackOffice
5   William BackOffice
6   Pincton Accounting
7   Frank   Treasury
8   Vincent BackOffice
9   Jody    Security

我想查询获取所有记录的表,并为每个记录分配一个序列给部门,所以结果将是这样的:

1   John    Accounting  1
2   Frederick   BackOffice  2
3   Erick   Accounting  1
4   Marc    BackOffice  2
5   William BackOffice  2
6   Pincton Accounting  1
7   Frank   Treasury    4
8   Vincent BackOffice  2
9   Jody    Security    3

我知道我可以得到他们部门内每条记录的序列号,使用 rownum over partition by ...,问题是我如何在组级别做“相同”,为每个组分配一个序列(假设order 是按部门名称,如示例中所示)。有任何想法吗?

4

1 回答 1

5

使用 ALL_TABLES 作为演示(“owner”而不是“department”,“table_name”而不是“name”),我想dense_rank会给你你想要的:

SELECT owner, 
       table_name, 
       ROW_NUMBER () OVER (PARTITION BY owner ORDER BY table_name) as table_seq, 
       DENSE_RANK () OVER (ORDER BY owner) as owner_seq
FROM   all_tables

这样做的原因是它dense_rank提供了所提供的顺序的排名。无论哪个所有者(部门)先出现,都是该所有者的所有实例的平局,因此所有这些记录的排名均为 1。由于我们使用dense_rank而不是rank,所有这些平局都不算在增加排名中,所以下一个所有者的等级为 2。


如果我正确理解您的后续问题,使用我的示例,您想显示每个所有者和每个所有者的前 500 个表?在这种情况下,您真的只想根据 过滤table_seq,因此您必须使用子查询:

SELECT * 
FROM   (SELECT owner, 
               table_name, 
               ROW_NUMBER () OVER (PARTITION BY owner ORDER BY table_name) as table_seq, 
               DENSE_RANK () OVER (ORDER BY owner) as owner_seq
        FROM   all_tables)
WHERE  table_seq <= 500
于 2011-07-14T18:54:00.800 回答