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