Увеличение номера строки в группе с повторными группами

Я работаю над запросом для PLSQL (Oracle 12), в котором мне нужно увеличить номер строки набора данных для каждой группы.

Моя проблема похожа на этот вопрос ( Увеличение номера строки в группе). Однако у меня немного другой сценарий. У меня повторяется один и тот же оттенок для данных, и я хочу сохранить исходный порядок при группировании.

Для данных ниже

Level | Shade
-------------
1     | A
2     | A
3     | A
4     | B
5     | B
6     | B
7     | A
8     | A
9     | A

Я хочу получить следующий результат

Group | Shade | Amount
----------------------
1     | A     | 3
2     | B     | 3
3     | A     | 3

Если я использую функцию DENSE_RANK, упорядоченную по Shade, я не смогу сохранить первоначальный порядок, и вот что я получаю:

Group | Shade | Amount
----------------------
1     | A     | 6
2     | B     | 3

Как я могу сохранить исходный шаблон группы при группировке?

1 ответ

Вы можете использовать разницу номеров строк для определения групп:

select Shade, count(*) as amount
from (select t.*,
             row_number() over (order by level) as seqnum,
             row_number() over (partition by shade order by level) as seqnum_s
      from t
     ) t
group by Shade, (seqnum - seqnum_s);

Немного сложно объяснить, почему это работает. Если вы посмотрите на результаты подзапроса, становится очевидным, почему разница между двумя row_number() значения идентифицируют последовательные группы.

Другие вопросы по тегам