【问题标题】:Get first %p of column values获取第一个 %p 列值
【发布时间】:2019-08-14 19:51:29
【问题描述】:

假设我们有一张桌子:

Students (First_Name, Last_Name, Section_Name, Grades_Avg)

我需要编写一个查询,获取每个部分的学生的第一个 %p(过程参数),其属性为(First_Name、Last_Name、Section_Name、Grades_Mean),降序排列在 Grades_Avg 之后,升序排列在 Last_Name 之后,使用Grades_Avg > 5。

我的作品:

select First_Name, Last_Name, Section_Name, Grades_Avg 
from STUDENTS where Grades_Avg>5 
ORDER BY Section_Name, Grades_Avg DESC 
FETCH FIRST p PERCENT ROWS ONLY;

但是有了这个我没有得到每个 Section_Name(第一个 %p)我得到所有部分的整体。

【问题讨论】:

    标签: sql oracle oracle12c


    【解决方案1】:

    Oracle 有一个名为 percent_rank() 的函数,可能可以提供帮助:

    select s.*
    from (select s.*,
                 percent_rank() over (partition by section order by grades_avg) as p_rank
          from students s
          where s.grades_avg > 5
         ) s
    where p_rank <= p;
    

    这里假设p 是一个介于 0 和 1 之间的数字。如果它介于 0 和 100 之间,那么:

    where p_rank <= p / 100
    

    请注意,具有相同成绩的学生具有相同的p_rank 值,因此他们全部包含或全部不包含。

    如果您希望返回一个准确的数字——例如,即使所有学生的成绩相同,也尽可能接近 20%,那么 row_number()count() 可以实现这一目标。

    【讨论】:

    • 嗨,我测试了你的建议,但我认为 p_rank
    • @valer 。 . .我不明白评论。 p_rank 是 0 和 1 之间的比率。如果你想要 20% 的行,你想要 p_rank &lt;= 0.2。如果你想传入20 而不是0.20,那么你使用p_rank &lt; 20 / 100
    • 对不起,我放了其他东西而不是 percent_rank()。现在可以了。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2014-12-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多