我的表的行数在 25k 到 250k 之间。现在我需要将整个表分成 block ,以便使用 NTILE
进行处理。如果我将固定计数指定为 NTILE(4)
,它对我来说效果很好。我们有什么办法动态传递参数吗?
我想将单个批量大小保持在25k。因此,如果表有 40k 行参数值应为 2,如果其 150k,则应为 6 等等于...
请建议如何实现这一目标。
最佳答案
从您的描述中不清楚为什么要动态传递参数,而不是将其作为静态表达式,也许类似于
已编辑:最初我直接在 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>)
关于sql - NTILE 的动态参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422033/