Sql Oracle-按百分比限制行数()

Sql Oracle-按百分比限制行数(),sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我编写了一个查询,从总结果集中得到n%。我不确定这是否是一种有效的查询方式 以下是我的查询,它是一个经过修改的查询,用于理解,从总结果集中得到20%: SELECT * FROM ( WITH RS AS ( SELECT ID ,ROW_NUMBER() OVER ( ORDER BY ID ) r_num ,count

我编写了一个查询,从总结果集中得到n%。我不确定这是否是一种有效的查询方式

以下是我的查询,它是一个经过修改的查询,用于理解,从总结果集中得到20%:

SELECT *
FROM (
    WITH RS AS (
            SELECT ID
                ,ROW_NUMBER() OVER (
                    ORDER BY ID
                    ) r_num
                ,count(1) OVER () AS n_rows
            FROM TAB1
            LEFT OUTER JOIN TAB2 ON TAB1.ID = TAB2.ID
            INNER JOIN TAB4 ON TAB4.ID = TAB4.ID
            INNER JOIN TAB3 ON TAB3.ID = TAB4.ID
            WHERE TAB2.ID_ IS NULL
                AND TAB3.C_ID = 'JP'
            )
    SELECT *
    FROM RS
    WHERE r_num <= round(n_rows * 0.2)
    ORDER BY ID
    )
你有什么建议可以有效地从结果集中提取第一个/最后一个/随机n%?

因为你使用的是11gas,从标签上看,我建议使用NTILE分析函数。您可以在文档中阅读更多信息。NTILE将有序数据集划分为多个存储桶。例如,在您的情况下,前10%的行类似于:

第10节按id订购

查询可以重写为:

WITH RS AS (
            SELECT ID
                ,NTILE (10) OVER (ORDER BY id) r_num
            FROM TAB1
            LEFT OUTER JOIN TAB2 ON TAB1.ID = TAB2.ID
            INNER JOIN TAB4 ON TAB4.ID = TAB4.ID
            INNER JOIN TAB3 ON TAB3.ID = TAB4.ID
            WHERE TAB2.ID_ IS NULL
                AND TAB3.C_ID = 'JP'
            )
SELECT id 
   FROM rs
  WHERE r_num = 10
ORDER BY id
注意:因为您没有提供测试用例,所以我没有您的表和数据来重新创建测试用例

这是关于之前的12c,现在在12c中,您有了新的行限制条款,您只需将其添加到条款中:

仅获取前10%的行

例如:

SELECT col
FROM   table
ORDER BY col
FETCH FIRST 10 PERCENT ROWS ONLY;

它与旧的ROWNUM相比具有优势,而旧的ROWNUM在需要有序结果集时一直是个问题。在我上面的例子中,12c中有了新的行限制子句,您将始终得到一个有序的结果集。您可以在这里查看更多示例

在Oracle中,您还可以使用sample 20子句获取select语句的20%随机行。这对OP没有帮助,因为他正在查找一个有序行。我的拍摄是在12c和之前版本中拍摄的。在12c中,我们现在有了使用百分比的新行限制条款。感谢@Sylvain修复URLYes,它是。没有多少人知道它:-很好,现在你也知道了。