如何从表中检索一半记录 - Oracle 11g

时间:2015-06-11 13:19:32

标签: sql oracle

如何从表中检索(select)一半的记录,例如,包含1000行的表,从表中检索500(50%)。 (在这种情况下,我可以使用rownum,因为我们知道行的确切数量(1000) - select * from table where rownum <= 500),但我必须计算每个表来实现该语句。

您认为我能做到这一点的最佳方式是什么?

6 个答案:

答案 0 :(得分:9)

好吧,你可以计算行数并选择一半:

select *
from   my_table
where  rownum <= (select count(*)/2 from my_table)

倾向于选择在物理段内连续的行。

或......

select *
from   (select rownum rn, * from my_table)
where  mod(rn,2) = 0

那将倾向来选择&#34;其他所有&#34;因此,您可以从物理数据段中获得非常均匀的传播。

或......

select *
from   my_table sample (50)

那将是大约一半的行。

或......

select *
from   my_table sample block (50)

这将是来自段的高水位线下方大约一半数据块的行。

可能有很多种不同的方式,你想要哪种方式可能取决于你是否想要所选的伪随机数。

如果要使用查询的输出,请使用以下内容:

select ...
from   (select *
        from   my_table
        where  rownum <= (select count(*)/2 from my_table)) my_table
join   ...

在这种情况下,SAMPLE语法会更紧凑。

答案 1 :(得分:2)

使用NTILE窗口函数:

select * from (SELECT *, NTILE(2) OVER(ORDER BY (SELECT NULL FROM DUAL)) nt FROM TableName) as t
where nt = 1

或:

select * from (SELECT *, NTILE(2) OVER(ORDER BY NULL) nt FROM TableName) as t
where nt = 1

答案 2 :(得分:2)

如果您使用的是12c,则可以使用前n行限制功能,该功能可以限制行的百分比

例如,在EMP架构的SCOTT表中,我有14 rows,我想根据sal的顺序首先50 percent rows

SQL> SELECT empno, sal FROM emp
  2  ORDER BY sal
  3  FETCH FIRST 50 PERCENT ROWS ONLY;

     EMPNO        SAL
---------- ----------
      7369        800
      7900        950
      7876       1100
      7521       1250
      7654       1250
      7934       1300
      7844       1500

7 rows selected.

SQL>

答案 3 :(得分:1)

据我所知,执行此操作的最佳方法是执行以下代码块:

  

SELECT * FROM table_name
  WHERE ROWNUM&lt; =(SELECT COUNT(*)/ 2 FROM   表名);

并获得下半场:

  
    

SELECT * FROM
    (SELECT ROWNUM AS RN,table_name。* FROM table_name)
    哪里有RN&gt; (SELECT COUNT(*)/ 2 FROM table_name);

  

答案 4 :(得分:0)

你想要哪一半的行?

这得到了所有其他行...

Select * from table t
Where Mod(rownum, 2) = 0

上半场......

Select * from table t
Where rownum <= 
    (Select count(*) 
     from table) / 2

答案 5 :(得分:0)

如果记录总数不是偶数,则上面的查询将不起作用,无论async function action () { await asyncFunction() await anotherAsyncFunction() // easy to add another function, no need to touch "return" await andAnotherAsyncFunction() } 返回整数还是十进制

,这都是有效的查询
count(*)/2