如何编写 SQL 查询以从表中提取50%的记录?
在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)。