表workload(empid,workdate,hours),用一条sql查询出平均每天工作小时数最多的员工id,试了很多,都感觉写的很累赘,select empid
  from (select empid, avg(hours) as avghours          
         from workload
         group by empid) c
 where c.avghours>= (select max(avghours)
                      from (select empid, avg(hours) as avghours
                              from workload
                             group by empid))
用了两次相同的子查询,
谁能用简洁的一条sql搞定呢,麻烦献上一条哦,感谢!!!

解决方案 »

  1.   


    select empid
      from( 
    select empid, 
           avg(hours),
           row_number()over(order by avg(hours) desc) as rn
      from workload
     group by empid
    )where rn = 1 -- rn = 1 平均时长第一,rn=2 平均时长第二 通用不?
      

  2.   

    正解,
    分析函数,改成rank更好吧,可以查询出并列的。
      

  3.   

    SELECT empid
      FROM (SELECT AVG(hours), empid
              FROM workload
             GROUP BY empid
             ORDER BY AVG(hours) DESC)
     WHERE ROWNUM = 1
      

  4.   

    rank和dense_rank我怎么就没想到呢。
      

  5.   


    需要查询出并列的,用rank 怎么写呢?
      

  6.   

    感觉有点高级了,试卷里面会考rank这个用法吗? 不知道出题者到底需要怎么样的答案
      

  7.   

    哦,rank 就是把row_number() 函数换成 rank(), 学了一招了,非常感谢了