2013-10-30 3 views
0

날짜 및 주문 열이있는 테이블이 있습니다. 이 테이블에 다음과 같이 채울 Batch라는 열을 추가하려고합니다. 각 날짜에 대해 첫 번째 Order에서 시작하여 각 두 주문을 한 배치로 그룹화합니다.동일한 테이블의 다른 열 값을 기반으로 열에 값 지정

이 예제에서 첫 번째 4 개 레코드 인 Date = 1 인 레코드의 경우, 첫 번째 두 레코드 (Order = 10 및 Order = 30)의 배치 번호는 Batch = 1이고 두 번째 레코드 (Order = 80 및 Order = 110)에는 Batch = 2 등이 있습니다.

나머지 레코드 수가 배치 크기 (이 예에서는 2)보다 작 으면 남은 순서에는 다음 예제와 같이 별도의 배치 번호가 있습니다. number 마지막 레코드 (5 레코드)이 있도록 날짜와 레코드 = 2, 홀수 배치 = 3

Date Order 
----------- 
1  10 

1  30 

1  80 

1  110 

2  20 

2  30 

2  50 

2  70 

2  120 

3  90 

Date Order Batch 
------------------ 
1  10  1 

1  30  1 

1  80  2 

1  110 2 

2  20  1 

2  30  1 

2  50  2 

2  70  2 

2  120 3 

3  90  1 

답변

2

각 내에서 행 번호 1,2,3, ...을 얻을 수있는 분석 기능 ROW_NUMBER를 사용하여 날짜. 그런 다음 하나를 더하고 두로 나누십시오.

select 
    dateid, 
    orderid, 
    trunc((row_number() over (partition by dateid order by orderid) +1)/2) as batch 
from mytable; 
+0

감사합니다. 그것은 작동합니다. – Matin

+0

아주 기본적인 질문은 죄송합니다. 이 쿼리를 실행하면 "단일 행 하위 쿼리가 두 개 이상의 행을 반환합니다"라는 오류 메시지가 표시되는 이유는 무엇입니까? update mytable set batch = (selecttrunc (row_number() over (orderid별로 dateid 순서로 파티션) +1)/2) from mytable'); – Matin

+0

내부 쿼리에서 테이블의 모든 레코드를 선택했기 때문에. 각 갱신 레코드마다 하나의 레코드 만 선택하려고합니다. 내부 레코드에서 where 절을 사용하여 업데이트 레코드의 키로 제한해야합니다. –

관련 문제