我创建了一个数据库,其中工作人员具有收费率并且工作特定的小时数。从这里我做了一个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%的收入。这可能吗?
谢谢,为我缺乏经验道歉!
答案 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;