4

次のようなOracle11gテーブルがあります。

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を使用して、部門内の各レコードのシーケンス番号を取得できることはわかっています...問題は、グループレベルで「同じ」を実行し、各グループにシーケンスを割り当てる方法です(たとえば、順序は、例のように部門名によるものです)。何か案は?

4

1 に答える 1

5

ALL_TABLESをデモンストレーションとして使用すると(「department」の代わりに「owner」、「name」の代わりに「table_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 に答える