【问题标题】:Retrieving the top 20% of a particular column in Oracle SQL? [duplicate]检索 Oracle SQL 中特定列的前 20%? [复制]
【发布时间】:2015-12-25 04:51:45
【问题描述】:

我创建了一个数据库,其中工人有一个收费率并工作特定的小时数。从这里我完成了一个 select 语句,它只显示了有关工人的一些信息,然后我创建了一个名为 Earnings 的新列,它使用 rate_per_hour * task_hours 来给出他们的总收入。

我的问题是,有没有办法根据 select 语句中创建的新 Earnings 列仅显示前 20% 的最高收入者?

到目前为止,我有这个:

SELECT worker.worker_id
    ,worker_first_name
    ,worker_surname
    ,worker_case_id
    ,task_hours
    ,rate.rate_id
    ,rate_per_hour
    ,task_hours * rate_per_hour AS Earnings
FROM worker
    ,note
    ,rate
WHERE worker.worker_id = note.worker_id
    AND rate.rate_id = note.rate_id;

我只需要根据我创建的新列显示前 20% 的收入。这可能吗?

谢谢,对我缺乏经验深表歉意!

【问题讨论】:

    标签: sql oracle function


    【解决方案1】:

    首先,您应该使用明确的join 语法。其次,您可以使用percentile_cont()percentile_disc() 做您想做的事情。但是,我经常使用row_number()count() 来执行此操作:

    SELECT wnr.*
    FROM (SELECT w.worker_id, worker_first_name, worker_surname, worker_case_id,
                 task_hours, r.rate_id, rate_per_hour,
                 task_hours * rate_per_hour AS Earnings,
                 row_number() over (order by task_hours * rate_per_hour desc) as seqnum,
                 count(*) as cnt
          FROM worker w JOIN
               note n
               ON w.worker_id = n.worker_id JOIN
               rate r
               ON r.rate_id = n.rate_id
         ) wnr
    WHERE seqnum <= cnt * 0.2;
    

    【讨论】:

      【解决方案2】:

      如果您希望获得相同的排名以获得相同的收入,您也可以使用排名分析函数而不是 row_number。

      Select * from (
      Select employee,earnings,rank() over (order by earnings desc )/count(*) over() As top from employees)
      Where top<=0.2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-17
        • 1970-01-01
        • 2012-09-13
        • 2018-06-11
        • 2013-03-03
        • 1970-01-01
        • 1970-01-01
        • 2016-08-10
        相关资源
        最近更新 更多