如何从表中检索(select)一半的记录,例如,包含1000行的表,从表中检索500(50%)。 (在这种情况下,我可以使用rownum,因为我们知道行的确切数量(1000) - select * from table where rownum <= 500
),但我必须计算每个表来实现该语句。
您认为我能做到这一点的最佳方式是什么?
答案 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