代码之家  ›  专栏  ›  技术社区  ›  Chris Martin

使用jOOQ选择rownum/max(rownum)

  •  1
  • Chris Martin  · 技术社区  · 11 年前

    我正在研究一个使用Oracle的SQL查询 rownum 伪列,选择行数作为总行数的一部分:

    ROWNUM/(MAX(ROWNUM) OVER())
    

    我试图通过jOOQ编写的查询来完成同样的任务。这可能吗?

    2 回复  |  直到 11 年前
        1
  •  2
  •   Dmitry Nikiforov    11 年前

    我不确定我是否正确回答了你的问题——这是你需要的吗?

    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      
    
        2
  •  1
  •   Community Mohan Dere    8 年前

    虽然 Dmitry's CUME_DIST() solution 可能更适合实际查询,下面是 ROWNUM jOOQ中的解决方案,记录如下:

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

    另请参见: DSL.rownum()

    推荐文章