группа над разделом - PullRequest
4 голосов
/ 14 июля 2011

У меня есть таблица 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 ..., вопрос в том, как я могу сделать «то же самое» на уровне группы, назначая последовательность каждой группе ( скажем, порядок по названию отдела, как в примере). Есть идеи?

1 Ответ

5 голосов
/ 14 июля 2011

Использование 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
...