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_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)
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |