2014-02-24 2 views
1

표시된 행에 대한 작업을 수행하기 위해 oracle에서 쿼리를 실행하여 테이블의 토큰을 업데이트하고 있습니다.그룹 기반 쿼리 결과 제한

제 문제는 매번 특정 배치 크기로 업데이트되는 행 수를 제한하고 결과별로 그룹으로 제한하려고합니다.

내가 추상적으로 설명하기는 다소 어렵습니다. 그래서 그것을 구체화 할 것입니다. (ID, IdFile 그룹화, 이름, 주소 1, 주소 2, Address3, 국가, 토큰)

가 난 할 노력하고있어 것은 만들 수 있습니다 :

내가 다음 필드가 '준비'라는 테이블을 가지고 말 이 정보로 일괄 처리하는 쿼리.

각 일괄 처리에 대해 토큰을 업데이트하여 해당 레코드가 나중에 작동하도록 표시되도록합니다. 파일별로 일괄 처리가 필요하며 각 일괄 처리에는 크기 제한이 있으므로 rownum을 사용하여 제한하고 있습니다. 다른 제한 사항은 배치별로 그룹화하는 것입니다.

내 배치 크기가 5라고 가정 해 봅시다. 그룹화 열이 3 개 3 개 밖에없는 행을 3 개만 배치로 만들어야합니다.

이것은 내가 그룹을 수행 할 때와 마찬가지로 그룹화를 사용하거나 사용하지 않고 결과를 한 번에 얻을 수있게 해준 가장 큰 애완 동물입니다. (그룹화했다면 운명 주소가 모든 행에 대해 동일한 지 확인해야하고 그 행을 사용하여 배치를 만들어야합니다.)

이 쿼리를 어떻게 작성해야하는지 이해해 주시겠습니까?

내가 지금 사용하고 있습니다 것은 다음 데이터의 경우

update schema.staging set 
token = 'token4' 
where id in (select t.id 
       from (
    select stage.id, stage.grouping 
    from (select idFile 
      from (select a.idFile 
        from schema.staging a 
        inner join schema.config c on c.id = a.idcfgpriority 
        where nvl2(a.token,0,1) = 1 
        group by a.idFile, c.order 
        order by c.order desc) files 
      where rownum = 1) priorityFile 
      inner join schema.staging stage on stage.idFile = priorityFile.idFile 
     where nvl2(stage.token,0,1) = 1 
     group by stage.idFile, stage.token, stage.id, grouping sets ((stage.grouping), 
                      (stage.name, stage.Address1,stage.Address2,stage.Address3,stage.Country)) 
     order by stage.grouping 
    ) t 
where rownum <= 5) 

: 나는 6 개 배치를 기다리고있을 것입니다

Id IdFile Grouping Name Address1 Address2 Address3 Country  Token 
==================================================================================== 
1 1  null  Name1 Address1 Address1 Address1 Country  null 
2 1  1   Name1 Address1 Address1 Address1 Country  null 
3 1  1   Name1 Address1 Address1 Address1 Country  null 
4 1  1   Name1 Address1 Address1 Address1 Country  null 
5 1  2   Name1 Address1 Address1 Address1 Country  null 
6 1  2   LALAL XPTO  Address1 Address1 Country  null 
7 1  null  Name1 Address1 Address1 Address1 Country  null 
8 1  null  Name1 Address1 Address1 Address1 Country  null 
9 1  null  Name1 Address1 Address1 Address1 Country  null 
10 2  null  Name1 Address1 Address1 Address1 Country  null 
11 2  null  Name1 Address1 Address1 Address1 Country  null 
12 2  null  Name1 Address1 Address1 Address1 Country  null 
13 2  null  Name1 Address1 Address1 Address1 Country  null 
14 2  null  Name1 Address1 Address1 Address1 Country  null 
15 2  null  Name1 Address1 Address1 Address1 Country  null 

.

batch#1: 1, 7, 8, 9 
batch#2: 2, 3, 4 
batch#3: 5 
batch#4: 6 
batch#5: 10, 11, 12, 13, 14 
batch#6: 15 

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

건배

+1

샘플 데이터와 원하는 결과를 제공 할 수 있습니까? –

+0

완성 해 주셔서 감사합니다. – Silva

답변

1

나는 완전히 세부 사항에있는 모든 requreiments을 이해 모르겠지만, 샘플 데이터를 기반으로 원하는 출력은 다음과 같은 쿼리가 작동합니다

SELECT dense_rank() over(ORDER BY "IdFile", 
            "Grouping" nulls FIRST, 
            "Name" desc, 
            "Address1", 
            "Address2", 
            "Address3", 
            "Country", 
            "Token", 
            row_num) batch_num, 
     q.* 
    FROM (SELECT trunc((row_number() 
         over(partition BY "IdFile", 
          "Grouping", 
          "Name", 
          "Address1", 
          "Address2", 
          "Address3", 
          "Country", 
          "Token" ORDER BY "Id") - 1)/5) row_num, 
       s.* 
      FROM sample s) q 
ORDER BY "Id"; 

결과 :

| BATCH_NUM | ROW_NUM | ID | IDFILE | GROUPING | NAME | ADDRESS1 | ADDRESS2 | ADDRESS3 | COUNTRY | TOKEN | 
|-----------|---------|----|--------|----------|-------|----------|----------|----------|---------|--------| 
|   1 |  0 | 1 |  1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   2 |  0 | 2 |  1 |  1 | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   2 |  0 | 3 |  1 |  1 | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   2 |  0 | 4 |  1 |  1 | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   3 |  0 | 5 |  1 |  2 | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   4 |  0 | 6 |  1 |  2 | LALAL |  XPTO | Address1 | Address1 | Country | (null) | 
|   1 |  0 | 7 |  1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   1 |  0 | 8 |  1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   1 |  0 | 9 |  1 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   5 |  0 | 10 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   5 |  0 | 11 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   5 |  0 | 12 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   5 |  0 | 13 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   5 |  0 | 14 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 
|   6 |  1 | 15 |  2 | (null) | Name1 | Address1 | Address1 | Address1 | Country | (null) | 

SQL Fiddle.

내가 제공 한 배치 번호 매기기를 완벽하게 시뮬레이트하기 위해 주문을 조금 해 봤습니다. descnulls FIRST 부분을 안전하게 삭제할 수 있습니다. 쿼리가 문제를 해결하면 알려주십시오.

+0

나는 약간의 조정을해야했지만 귀하의 질문은 내 문제를 극복하는 데 도움이되었습니다! 감사! – Silva