postgresql 如何从距顶部20%的行子集中选择随机行(跳过),限制为10

eagi6jfj  于 2022-12-26  发布在  PostgreSQL
关注(0)|答案(1)|浏览(154)

我有一个表questions,每个问题都有一个difficulty属性,我需要一个按difficultyASC排序的随机问题,然后跳过20%,限制10%,并随机选择该子集。
我得到的最接近的:

select *, PERCENT_RANK() over ( order by difficulty ) from questions

这将为每一行添加另一列percentage,然后我可以使用where子句过滤掉required。
然后我意识到PERCENT_RANK并没有按照我想要的方式工作。它计算的是行的百分比与所有行的所有难度之和的百分比。但我想要的是ROW_NUMBER与总行数的百分比。
所以我需要这样的东西:

select *, PERCENT_RANK() over ( 'ROW NUMBER SOMEHOW HERE' ) from questions order by difficulty
laik7k3q

laik7k3q1#

我认为,如果将row_number()count()分析(窗口)函数结合起来,就可以简单地获取20%到30%之间的行。
大概是这样的

with cte as (
  select
    q.*, row_number() over (order by difficulty) as rn,
    count (*) over (partition by 1) as total
  from
    questions q
)
select *
from cte
where rn between total * 0.2 and total * 0.3
order by random()

order by random()只是我对你最后评论"和随机的子集"的回应。

相关问题