2013-08-30 3 views
0

item_ids 집합을 기반으로 group_ids를 만들려고합니다. item_ids가 단일 그룹의 일부임을 나타내는 유일한 사실은 item_ids가 순차적이라는 사실입니다. 예를 들어, 아래의 처음 두 열을 기반으로, 내가 원하는 출력이 3 번째 :시퀀스를 사용하여 그룹 ID 생성

item item_id group_id 
ABC 282  2 
ABC 283  2 
ABC 284  2 
ABC 285  2 
ABC 051  3 
ABC 052  3 
ABC 189  4 
ABC 231  5 
ABC 232  5 
ABC 233  5 
ABC 234  5 
ABC 247  6 
ABC 248  6 
ABC 249  6 
ABC 250  6 
ABC 091  7 
ABC 092  7 

GROUP_ID가 반드시 순차적 자체가 될 필요가 없습니다, 그것은 단지 고유해야합니다. 나는 다음과 같은 코드로이 시도 :

create sequence seq 
    start with 1 
    minvalue 1 
    increment by 1 
    cache 20; 

select seq.nextval from dual; --to initialize the sequence 

select 
    item, 
    item_id, 
    case when diff = 1 then seq.currval else seq.nextval end group_id 
from 
    (
     select 
      item, 
      item_id, 
      (id - lag(id, 1, 0) over (order by 1) diff 
     from 
      (
       select 
        item, 
        item_id 
       from 
        table 
      ) 
    ); 

그러나 다음과 같은 출력을 얻을 :

item item_id group_id 
ABC 282  2 
ABC 283  3 
ABC 284  4 
ABC 285  5 
ABC 051  6 
ABC 052  7 
ABC 189  8 
ABC 231  9 
ABC 232  10 
ABC 233  11 
ABC 234  12 
ABC 247  13 
ABC 248  14 
ABC 249  15 
ABC 250  16 
ABC 091  17 
ABC 092  18 

문제의 원인을 찾고, 내 솔루션은 수상 이유를 자세히 설명 사용자 ShannonSeverance에 의한 excellent explanation 발견 일하지 마라. 그러나 앞으로 나아갈 방법에 대한 제안은하지 않았다.

누구에게 아이디어가 있습니까?

답변

1

SQL 테이블이 본질적으로 순서가 지정되지 않았으므로 문제가 있습니다. 다음 논리적하지만 그것이 실제로는하지 않습니다 작동 "해야한다"

select ii.*, (item_id - rownum) as grp_id 
from item_ids ii; 

위해 마이너스 행 번호에 item_ids의 순서가 일정하다. 적어도 특정 항목에 대해 그룹에 사용할 수 있습니다. 값을 함께 연결하여, 여러 항목을 처리하기 위해 : - 이것은 select의 결과의 순서를 보장

select ii.*, item||'-'||(item_id - rownum) as grp_id 
from item_ids ii; 

정말이 일을하려면, 당신은 order by을 추가해야합니다.

select ii.*, item||'-'||(item_id - rownum) as grp_id 
from item_ids ii 
order by item, item_id; 

그렇지 않으면, 당신은 항목에 대한 적절한 순서를 결정하기 위해 다른 열을 필요 :이 그룹 사이에 "구멍"이 있다고 가정 작동 할 수 있습니다.