NTILE 的动态参数

Dynamic parameter for NTILE

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

我想将单个批量大小保持为 25k。所以如果table有40k行参数值应该是2,如果它的150k,应该是 6 等等...

请建议如何实现。

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

已编辑:最初我在 NTILE() 的参数中直接在子查询中获得计数,但这不起作用 - Oracle 实现不支持。

这应该有效 - 在 SCOTT 架构中的 EMP table 上测试:

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 

所以,base table 中的行数需要单独计算,然后使用交叉连接(这很好,因为其中一个 table 只有一行).

所以:

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

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

分配 x