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