2012-04-26 2 views
2

У меня есть некоторые данные о продуктах, которые с трудом работают. Продукты могут быть проданы с 1, 2 или 3 частями, а способ, которым была разработана система, части 2 и 3 для заказанного продукта были просто следующими рядами после первой строки для этого продукта.Разделение связанных строк на группы

Вот некоторые выборочные данные ....

---------------------------------------------------------- 
OrderId  Sku  Type  Row_Id OtherColumns... 
---------------------------------------------------------- 
123   001  Double 0  Other stuff.. 
123   001  Double 1  Other stuff.. 
123   001  Double 2  Other stuff.. 
123   001  Double 3  Other stuff.. 
123   002  Single 4  Other stuff.. 
123   003  Triple 5  Other stuff.. 
123   003  Triple 6  Other stuff.. 
123   003  Triple 7  Other stuff.. 
123   001  Double 8  Other stuff.. 
123   001  Double 9  Other stuff.. 
123   002  Single 10  Other stuff.. 
123   002  Single 11  Other stuff.. 
123   002  Single 12  Other stuff.. 
123   002  Single 13  Other stuff.. 

Старое программное обеспечение (VB) имеет дело с этим перебором строк и смотрит вперед, как это петли, получать необходимую информацию из строк, а затем пропускает их.

Быстрая перемотка вперед 8 лет ... Я унаследовал эту систему в своей новой работе и переписал систему с нуля. Проблема, с которой я сталкиваюсь, заключается в том, чтобы получить эти устаревшие данные в мой новый формат.

Я ищу способ выбрать одни и те же данные и разбить его на соответствующие номера сегментов. Я использовал RANK() OVER (PARTITION BY) без успеха. Я думаю, что я просто не делаю это правильно.

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

------------------------------------------------------------------- 
OrderId  Sku  Type  Row_Id  Segment OtherColumns... 
------------------------------------------------------------------- 
123   001  Double 0   1   Other stuff.. 
123   001  Double 1   2   Other stuff.. 
123   001  Double 2   1   Other stuff.. 
123   001  Double 3   2   Other stuff.. 
123   002  Single 4   1   Other stuff.. 
123   003  Triple 5   1   Other stuff.. 
123   003  Triple 6   2   Other stuff.. 
123   003  Triple 7   3   Other stuff.. 
123   001  Double 8   1   Other stuff.. 
123   001  Double 9   2   Other stuff.. 
123   002  Single 10   1   Other stuff.. 
123   002  Single 11   1   Other stuff.. 
123   002  Single 12   1   Other stuff.. 
123   002  Single 13   1   Other stuff.. 

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

Заранее за вашу помощь.

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

+0

Идентификатор для группы «» является только 'type' колонка, где а«двойной»значение означает два ряда сгруппированных, &«тройной»означает три? И - не следует ли создавать идентификатор, который отличается от группы, а не «сегмент», который, похоже, не группирует строки вообще? –

+0

Вторая таблица примеров - это не мой новый формат ... это просто набор результатов, позволяющий легко идентифицировать сегменты для процесса импорта данных. – ctorx

+0

Хорошо. И первая часть моего вопроса? –

ответ

4
select OrderId, 
     Sku, 
     Type, 
     Row_Id, 
     (row_number() over(partition by Type order by Row_Id) - 1) % 
     case Type 
      when 'Single' then 1 
      when 'Double' then 2 
      when 'Triple' then 3 
     end + 1 
from YourTable 
order by Row_Id 

SQL Fiddle

+0

Это потрясающе. К сожалению, я не на 2012 год. – ctorx

+1

@ctorx - Очевидно, что вы должны быть :) –

+0

@ctorx - Производительность во второй версии не должна быть такой плохой, если у вас есть указатель на 'Row_Id' с' Type' в качестве столбца include , –