2016-11-04 84 views
0

我有表格,其行数在之间25k250k。现在我需要将整个表格分成几块,以便使用NTILE进行处理。如果我将固定计数作为NTILE(4),它对我来说工作正常。我们有任何方法来动态传递参数吗?NTILE的动态参数

我想保留个别批量大小到25k。所以,如果表中有40K行参数值应为,如果其150K,它应该是等等...

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

+1

我怀疑NTILE实际上并不是你想要的。现有的全部目的是获取任意数量的记录并将它们分组为一组固定大小的块。就你而言,你需要一组可变大小的块,每块大小为25k行;因此只需使用ROW_NUMBER()的表达式,例如'CEIL(ROW_NUMBER()OVER(ORDER BY id)/ 25000)' –

回答

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

表不会有恒定数量的行,在一个时间点上它可以有25k行,在其他120k左右..如果我会修复它到4然后它不会工作,我必须不断改变数量根据行数。编写查询以获取计数不起作用,并且因为它需要一个常量而给出错误。 – Bhushan

+0

我不认为你正确地使用“动态”。只是传递一些不稳定的东西并不会使它变得“动态”。我的解决方案包含一个表达式,它将计数除以25,000,并且四舍五入 - 这不是“动态”。我不明白你的意思是“因为它期望一个常数” - 你能证明你是如何使用它的吗? – mathguy

+0

实际上,我发现问题 - 你不能将标量子查询作为NTILE()的表达式参数的一部分。思考解决方法... – mathguy

0

你可以声明2个变量X的NTILE(X)和y行的表格数量。 首先您将y分配为表格的count(*),然后使用if函数根据y分配x。

+0

我不知道如何在sql中声明变量。我在这里不使用PL/SQL。是否有可能仅使用SQL?如果是,请分享示例sql。 – Bhushan

+0

我从标签中猜测你正在使用oracle。 – cenzuratu

+0

申报 y号; begin 从表中选择count(*)到y; 结束; – cenzuratu