NTILE 的动态参数
Dynamic parameter for NTILE
我有 table,行数在 25k 到 250k 之间。现在我需要将整个 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
我有 table,行数在 25k 到 250k 之间。现在我需要将整个 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