我的表格的行数在 25k 到 250k 之间。现在,我需要将整个表格分成块,以便使用NTILE
进行处理。如果我将固定计数作为NTILE(4)
,它对我来说很好。我们有办法动态传递参数吗?
我想将个别批量维度维持在 25k 。因此,如果表有 40k 行参数值应为 2 ,如果其 150k ,则应为 6 ,因此上...
请建议如何实现这一目标。
答案 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。