groupnum over partition

Jos*_*ial 4 sql oracle database-partitioning rownum

我有一个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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我知道我可以获得他们部门内每个记录的序列号,使用rownum over partition by ...,问题是如何在组级别执行"相同",为每个组分配一个序列(让我们说订单是按部门名称,如示例中所示).有任何想法吗?

All*_*lan 5

使用ALL_TABLES作为演示("所有者"而不是"部门","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
Run Code Online (Sandbox Code Playgroud)

这样做的原因是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
Run Code Online (Sandbox Code Playgroud)