如何编写 SQL 查询以从表中提取 50% 的记录?

Posted

技术标签:

【中文标题】如何编写 SQL 查询以从表中提取 50% 的记录?【英文标题】:How to write SQL query for extracting 50 percent of records from a table? 【发布时间】:2021-01-04 05:28:04 【问题描述】:

如何检索 ANSI SQL 中 50% 的记录。在 MS SQL Server 中,我们有 Top 和百分比。但我想进入 Oracle 和 PostgreSQL。

【问题讨论】:

您是否愿意添加 1) 表结构 2) 示例数据和 3) 预期结果? ***.com/questions/54957288/… @Jim Jones,这是一个通用问题。我认为不需要样本数据,表结构。 【参考方案1】:

在 Postgres 中,一个选项使用percent_rank()。假设id 是您的订购栏:

select *
from (select t.*, percent_rank() over(order by id) prn from mytable t) t
where prn <= 0.5

这也适用于 Oracle,但对于该数据库,我更喜欢 fetch 子句:

select *
from mytable t
order by id
fetch first 50 percent rows only

【讨论】:

附带说明:在内部,fetch first 50 percent 被转换为 select * from (select row_number() over (order by id) as rn, count(*) over () as total) where rn &lt;= (total * 50/100) @GMB ,您的查询正在运行。你能帮我,如何在数据仓库中编写相同的查询。 为什么不能在数据仓库中使用相同的查询? @thatjeffsmith,此关键字在 Hive 等数据仓库中不可用。 关键字在所有 sql 中都不是通用的,如 oracle、MS sql、postgresql 等,我正在研究 hive,但面临复制相同的问题。

以上是关于如何编写 SQL 查询以从表中提取 50% 的记录?的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询:从表中删除除最新N之外的所有记录?

Sqoop 导入查询以从表中传输 1000 条随机记录?

MySql 查询从表中找出前 50% 的记录

将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

如何编写一个查询以从SQL Server中包含类似名称的多个表中获取数据

选择查询以从表中查找重复值 [重复]