2011-07-14 27 views
4

我有一個的Oracle 11g表如下:groupnum在分區

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在分區,問題是我怎麼能在集團層面做「相同」 ,爲每個組分配一個序列(假設訂單按照部門名稱,如示例所示)。有任何想法嗎?

+0

你的意思是,有沒有像'department'沒有表,每一個部門的名稱上市,隨着其唯一身份?你可以使用它。 – 9000

+0

這只是我爲了展示這個問題而開發的一個例子。 Readlly組是由桌子上的一堆字段完成的,因此每個組都沒有Id。 –

回答

5

使用ALL_TABLES作爲示範(「所有者」,而不是「部門」,「表格名」,而不是「名稱」),我覺得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 
+0

謝謝!那完美的作品。一個問題;就你的例子而言,我怎麼可以按照所有者對錶格進行分組,並且還可以對num_rows進行分組,因此每個組的行數不能超過500行? –

+0

這不完全是。在後續問題上我想要的是按照所有者和num_rows對錶進行分組,限制爲500.假設我們分別具有100,200,250和100行的表A,B,C和D.然後第一組將包括表A和B(共300行)。由於添加表C會使行數超過500,因此表C將包含在組2中,與表D相同。 –

+0

@Jose:這很棘手。我認爲分析函數的窗口方面可能會有所幫助,但是沒有一個明顯的解決方案值得思考。 – Allan