NTILE的动态参数

时间:2016-11-04 11:53:21

标签: sql oracle dynamic batch-processing

我的表格的行数在 25k 250k 之间。现在,我需要将整个表格分成块,以便使用NTILE进行处理。如果我将固定计数作为NTILE(4),它对我来说很好。我们有办法动态传递参数吗?

我想将个别批量维度维持在 25k 。因此,如果表有 40k 行参数值应为 2 ,如果其 150k ,则应为 6 ,因此上...

请建议如何实现这一目标。

2 个答案:

答案 0 :(得分:4)

从您的描述中不清楚为什么要动态传递参数,而不是将其作为静态表达式,可能类似

EDITED:最初我直接在NTILE()的参数中对子查询进行了计数,但这并不起作用 - Oracle实现不支持。

这应该可行 - 在SCOTT模式中的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>)

答案 1 :(得分:0)

您可以为NTILE(x)声明2个变量x,为表中的行数声明y。 首先将y指定为表的计数(*),然后使用if函数根据y指定x。