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

11 浏览
0 Comments

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

如何使用ANSI SQL检索50%的记录。在MS SQL Server中,我们可以使用Top加上百分比。但是我想在Oracle和PostgreSQL中实现相同的功能。

0
0 Comments

在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 <= (total * 50/100)

你的查询是有效的。你能帮我,在数据仓库中如何编写相同的查询吗?

为什么相同的查询在数据仓库中不能工作?

这些关键字在数据仓库中不可用,如Hive。

关键字在所有的SQL中都不是通用的,例如Oracle、MS SQL、PostgreSQL等。我正在使用Hive,但是在复制相同的查询时遇到问题。

那么将你的问题标记为针对Hive - 许多数据仓库都是在Oracle中实现的,相同的SQL在其中任何一个都可以工作。

你还指定了ANSI,并且fetch first是ANSI SQL语法。

每个数据仓库都允许ANSI SQL语法,为了获得通用的语法,我标记为ANSI。

Hive提供了类似SQL的接口...不确定它是否具有完整的ANSI SQL实现。

_horse_with_no_name当总记录数是奇数时,你能说一下这个查询如何工作吗?我尝试了5条记录。这返回了3条记录,我期望它返回2条(5/2)。

0