sql - NTILE 的动态参数

标签 sql oracle dynamic batch-processing

我的表的行数在 25k250k 之间。现在我需要将整个表分成 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/

相关文章:

mysql - 跨多个服务器连接表

mysql - 如何使用 sql 选择值作为数组?

sql - 如何将 WITHIN GROUP 从 Oracle 翻译成 Postgres?

javascript - 是否可以将模板对象保存为 JSON 标准格式的 JSON 文件?

sql-server - 如何执行动态创建的sql语句

sql - MS SQL - 从多对多表中选择数据,其中列的值与所有给定值匹配

oracle - 使用集合作为表定义的一部分

oracle - SQL Developer太慢了。我还能使用什么?

java - Selenium Webdriver - 从 li/a 查找动态 id

Sql 条件非空约束