2015-07-23 8 views
2

У меня возникли проблемы с созданием правильных разделов в моих данных. Вот пример того, что выглядит мои данные, как, в комплекте с желаемым выходом:нумерация разделов на основе изменяющихся измерений

customer contract type1 type2 partition 
100  1   A  A  1 
100  2   A  A  1 
100  3   A  B  2 
100  4   A  B  2 
100  5   A  B  2 
100  6   A  A  3 
100  7   A  A  3 
100  8   C  A  4 
100  9   C  A  4 

Переменная Я пытаюсь построить последний один, называемый раздел. У меня есть проблема сейчас в том, что при использовании dense_rank, контракты 1 и 2 группируются вместе с контрактами 6 и 7:

select 
    t1.* 
, dense_rank() over (order by customer, type1, type2) as partition 
from table1 t1 

Что я могу использовать для создания требуемого выходного сигнала (на достаточно большом наборе данных)?

+0

попробовать с 'DENSE_RANK() над (разделом по клиенту, договор, type1, заказ type2 Клиента, type1, type2), как partition' –

+0

@ vkp, который присваивает номер 1 каждой строке – freekvd

ответ

2

Если я правильно понимаю, вам нужны смежные группы строк, где «смежные» основаны на contract.

Вы можете сделать это, используя разницу в значениях row_number(). Эта разница является постоянной, когда значения смежны. В результате обеспечивает дополнительный столбец группировки, которая обеспечивает необходимую вам информацию:

select t1.*, 
     dense_rank() over (order by customer, type1, type2, grp) as partition 
from (select t1.*, 
      (row_number() over (partition by customer order by contract) - 
       row_number() over (partition by customer, type1, type2 order by contract) 
      ) as grp 
     from table1 t1 
    ) t1; 
+0

Это очень умное решение, спасибо! – freekvd

+0

Описанный метод здесь упоминается как метод [Tabibitosan] (https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=tabibitosan). [Boneist] (http://www.orchestrapit.co.uk/?tag=tabibitosan), [Rob Van Wijk] (http://rwijk.blogspot.com/2014/01/tabibitosan.html) и [Aketi Jyuuzou] (https://community.oracle.com/thread/1007478?tstart=0) все представляют хорошие статьи по методу – Sentinel

+0

@Jyuuzou. , , Я почти уверен, что я использовал что-то подобное на своих днях мышления, 25 лет назад, прежде чем функции аналитики были частью любой базы данных. Это трюки для использования параллельных операций сканирования. –

Смежные вопросы