我 如何 从 一 个 表 中 检索 * ( select ) * 一半 的 记录 , 例如 , 一 个 有 1000 行 的 表 , 从 表 中 检索 500 ( 50% ) 。 ( 在 这种 情况 下 , 我 可以 使用 rownum , 因为 我们 知道 行 的 确切 数量 ( 1000 ) - select * from table where rownum <= 500
) , 但 我 必须 计算 每个 表 才 能 实现 语句 。
你 觉得 我 能 用 什么 最 好 的 方法 来 做 这 件 事 ?
7条答案
按热度按时间2j4z5cfb1#
好 吧 , 你 可以 数 一下 行数 , 然后 选择 一半 :
中 的 每 一 个
这 将 * 倾向 于 * 选择 物理 段 内 连续 的 行 。
或者 ... ...
格式
这 将 " 倾向 于 " 选择 " 每 隔 一 行 " , 因此 您 将 从 物理 数据 段 中 获得 相当 均匀 的 分布 。
或者 ... ...
格式
这 将 是 大约 一半 的 行 。
或者 ... ...
格式
这 将 是 来自 段 的 高 水位 线 以下 的 大约 一半 数据 块 的 行 。
可能 有 很多 不同 的 方法 可用 , 你 想要 哪 一 种 可能 取决 于 你 是否 想要 选择 的 伪 随机 。
如果 要 使用 查询 的 输出 , 请 使用 类似 以下 的 语句 :
格式
在 这种 情况 下 , SAMPLE 语法 会 更 紧凑 。
k3fezbri2#
如果您使用的是Oracle
12c
,则可以使用Top-n行限制功能,该功能允许按行百分比进行限制。例如,在
SCOTT
模式下的EMP
表中,我有14 rows
,我需要基于sal排序的第一个50 percent rows
:7fhtutme3#
用
NTILE
窗口函数:或:
bogh5gae4#
就我所知,执行此操作的最佳方式是执行以下代码块:
SELECT * FROM表名
数据库中的所有数据都是从数据表中读取的。
而要得到下半部分:
选择 * 自
(SELECT ROWNUM AS RN,表名.* FROM表名)
(*)/2从表名开始);
nqwrtyyt5#
你要哪一半的行?
这会取得每隔一列...
这是前半部分。
ss2ws0br6#
如果记录总数不是偶数,上面的查询将不起作用,下面是工作查询,无论
count(*)/2
返回整数还是小数wkyowqbh7#
下面 是 检索 表 的 前 半 部分 的 另 一 个 查询 :
中 的 每 一 个
您 还 可以 选择 检索 同一 表 的 后 半 部分 :
格式