检索Oracle SQL中特定列的前20%?

时间:2015-12-24 20:22:58

标签: sql oracle function

我创建了一个数据库,其中工作人员具有收费率并且工作特定的小时数。从这里我做了一个select语句,它只显示了一些关于worker的信息,然后我创建了一个名为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%的收入。这可能吗?

谢谢,为我缺乏经验道歉!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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