NTILE的动态参数

问题描述 投票:0回答:2

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

我想将个别批量维持到25k。所以如果表有40k行参数值应该是2,如果是150k,那应该是6等等......

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

sql oracle dynamic batch-processing
2个回答
4
投票

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

编辑:最初我在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>)

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.