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

laximzn5  于 2022-11-22  发布在  Oracle
关注(0)|答案(7)|浏览(210)

我 如何 从 一 个 表 中 检索 * ( select ) * 一半 的 记录 , 例如 , 一 个 有 1000 行 的 表 , 从 表 中 检索 500 ( 50% ) 。 ( 在 这种 情况 下 , 我 可以 使用 rownum , 因为 我们 知道 行 的 确切 数量 ( 1000 ) - select * from table where rownum <= 500 ) , 但 我 必须 计算 每个 表 才 能 实现 语句 。
你 觉得 我 能 用 什么 最 好 的 方法 来 做 这 件 事 ?

2j4z5cfb

2j4z5cfb1#

好 吧 , 你 可以 数 一下 行数 , 然后 选择 一半 :

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

格式
这 将 " 倾向 于 " 选择 " 每 隔 一 行 " , 因此 您 将 从 物理 数据 段 中 获得 相当 均匀 的 分布 。
或者 ... ...

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 语法 会 更 紧凑 。

k3fezbri

k3fezbri2#

如果您使用的是Oracle 12c,则可以使用Top-n行限制功能,该功能允许按行百分比进行限制。
例如,在SCOTT模式下的EMP表中,我有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>
7fhtutme

7fhtutme3#

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
bogh5gae

bogh5gae4#

就我所知,执行此操作的最佳方式是执行以下代码块:
SELECT * FROM表名
数据库中的所有数据都是从数据表中读取的。
而要得到下半部分:
选择 * 自
(SELECT ROWNUM AS RN,表名.* FROM表名)
(*)/2从表名开始);

nqwrtyyt

nqwrtyyt5#

你要哪一半的行?
这会取得每隔一列...

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

这是前半部分。

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

ss2ws0br6#

如果记录总数不是偶数,上面的查询将不起作用,下面是工作查询,无论count(*)/2返回整数还是小数

SELECT ROWNUM, tmp.* 
FROM employees tmp
WHERE TO_NUMBER(ROWNUM) <= (SELECT count(*)/2 FROM employees);
wkyowqbh

wkyowqbh7#

下面 是 检索 表 的 前 半 部分 的 另 一 个 查询 :

SELECT * FROM your_table LIMIT (SELECT COUNT(*)/2 FROM your_table);

中 的 每 一 个
您 还 可以 选择 检索 同一 表 的 后 半 部分 :

SELECT * FROM your_table OFFSET (SELECT COUNT(*)/2 FROM your_table);

格式

相关问题