NTILE的动态参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NTILE的动态参数相关的知识,希望对你有一定的参考价值。
我的桌子行数在25k到250k之间。现在我需要将整个表格分成块,以便使用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>)
另一答案
您可以为NTILE(x)声明2个变量x,为表中的行数声明y。首先将y指定为表的count(*),然后使用if函数根据y指定x。
以上是关于NTILE的动态参数的主要内容,如果未能解决你的问题,请参考以下文章