用jOOQ选择rownum / max(rownum)

时间:2014-03-06 19:57:21

标签: java sql oracle jooq rownum

我正在查看使用Oracle的rownum伪列来选择行号作为总行数的一小部分的SQL查询:

ROWNUM/(MAX(ROWNUM) OVER())

我正在尝试通过jOOQ编写的查询来完成同样的事情。这可能吗?

2 个答案:

答案 0 :(得分:2)

我不确定我的问题是否正确 - 你需要它吗?

SQL> select row_number() over(order by ename)/(count(*) over()) fraction from emp;

  FRACTION                                                                      
----------                                                                      
    .08333                                                                      
    .16667                                                                      
    .25000                                                                      
    .33333                                                                      
    .41667                                                                      
    .50000                                                                      
    .58333                                                                      
    .66667                                                                      
    .75000                                                                      
    .83333                                                                      
    .91667                                                                      
   1.00000   

CUME_DIST分析函数也很有用:

SQL> SELECT ename, CUME_DIST()
  2     OVER (ORDER BY ename) fraction
  3     FROM emp
  4  /

ENAME        FRACTION                                                           
---------- ----------                                                           
ALLEN          .08333                                                           
BLAKE          .16667                                                           
CLARK          .25000                                                           
FORD           .33333                                                           
JAMES          .41667                                                           
JONES          .50000                                                           
KING           .58333                                                           
MARTIN         .66667                                                           
MILLER         .75000                                                           
SMITH          .83333                                                           
TURNER         .91667                                                          
WARD          1.00000      

答案 1 :(得分:1)

虽然Dmitry's CUME_DIST() solution可能更适合实际查询,但这里是jOOQ中的ROWNUM解决方案,用于记录:

// Qualified
DSL.rownum().div(DSL.max(DSL.rownum()).over());

// With static imports of DSL.*
rownum().div(max(rownum()).over());

另请参阅:DSL.rownum()