2016-11-04 5 views
0

25k ~ 250k 사이의 행 수를 가질 테이블이 있습니다. 이제이 전체 테이블을 청크로 나누어 처리하려면 NTILE을 사용해야합니다. 내가 고정 된 카운트를 NTILE(4)으로 줄 것이다. 그것은 나에게 잘 작동한다. 매개 변수를 동적으로 전달할 방법이 있습니까?NTILE의 동적 매개 변수

개별 배치 크기를 25k으로 유지하고 싶습니다. 테이블 40K 행이있는 경우 매개 변수 값이 2, 그 150K 경우, 등등 및 ...

해야해야한다 그래서 친절하게이를 달성하는 방법을 제안한다. 동적 매개 변수를 전달하려면, 그리고 정적 표현,

EDITED 같은 아마 무언가로가없는 이유를 설명으로부터

+1

NTILE이 (가) 실제로 원하는 것이 아닌 것 같습니다. 기존의 모든 목적은 모든 수의 레코드를 가져 와서 고정 된 크기의 청크 세트로 그룹화하는 것입니다. 귀하의 경우, 크기가 25k 행인 가변적 인 청크 집합이 필요합니다. ROW_NUMBER()에 대한 표현식을 사용하십시오. 'CEIL (ROW_NUMBER() OVER (ORDER BY id)/25000)' –

답변

4

그것은 분명하지 않다 : 처음에 나는 인수에 직접 하위 쿼리 수를했다 NTILE()에 있지만 작동하지 않습니다. Oracle 구현에서는 지원되지 않습니다.

이 작동합니다 - 스콧 스키마에 EMP 테이블에서 테스트가 :

select empno, ename, 
     ntile (ceil(ct/4)) over (partition by ct order by empno) as n_tile 
from emp cross join (select count(*) as ct from emp); 

    EMPNO ENAME   N_TILE 
---------- ---------- ---------- 
     7369 SMITH    1 
     7499 ALLEN    1 
     7521 WARD    1 
     7566 JONES    1 
     7654 MARTIN    2 
     7698 BLAKE    2 
     7782 CLARK    2 
     7788 SCOTT    2 
     7839 KING    3 
     7844 TURNER    3 
     7876 ADAMS    3 
     7900 JAMES    4 
     7902 FORD    4 
     7934 MILLER    4 

14 rows selected 

따라서, 기본 테이블의 행 수를 별도로 수행해야하고 인 (크로스 조인을 사용 테이블 중 하나에 단 하나의 행이 있으므로).

그래서 :

select ..... , ntile (ceil(ct/25000)) over (partition by ct order by .....) 
    .... 
    from <base_table> CROSS JOIN (select count(*) as ct from <base_table>) 
+0

테이블은 일정한 수의 행을 가지지 않을 것입니다. 한 시점에서 25k 행을 가질 수 있습니다. 다른 120k 정도가 될 수 있습니다. 4로 작동하면 작동하지 않을 것입니다. 행 수에 따라 번호를 계속 변경해야합니다. 개수를 얻기 위해 쿼리를 작성하는 것은 작동하지 않으며 상수가 예상되므로 오류가 발생합니다. – Bhushan

+0

"동적"이라고 정확하게 생각하지 않습니다. 일정하지 않은 것을 전달하는 것만으로 "동적"이되지는 않습니다. 내 솔루션에는 표현식이 포함되어 있습니다.이 계산식은 계산을 25,000으로 나눠서 반올림합니다. 이는 '동적'이 아닙니다. 나는 당신이 "상상을 불렀을 때"당신이 의미하는 것을 이해하지 못합니다. 당신이 이것을 어떻게 사용하는지 보여줄 수 있습니까? – mathguy

+0

사실, 문제가 생겼습니다. - NTILE()에 대한 표현식 인수의 일부로 스칼라 하위 쿼리를 사용할 수 없습니다. 해결 방법에 대한 생각 ... – mathguy

0

당신은 당신의 테이블에있는 행의 수에 대한 NTILE (x)와 y를 위해 두 변수 X를 선언 할 수 있습니다. 먼저 y를 표의 개수 (*)로 지정한 다음 if 함수를 사용하여 x를 y에 따라 지정합니다.

+0

SQL에서 변수를 선언하는 방법을 모르겠습니다. 여기서 PL/SQL을 사용하지 않습니다. SQL 만 사용하는 것이 가능합니까? 그렇다면 sample sql을 친절하게 공유하십시오. – Bhushan

+0

오라클을 사용하는 태그에서 추측됩니다. – cenzuratu

+0

선언 y 번호; begin 테이블에서 y로 count (*)를 선택하십시오. 끝; – cenzuratu