oracle 分組中排序(rank函數)


需求:

  查詢每個供應商每個類型產品銷售的top50中有多少

分析:

  1.查詢,以指定字段(供應商、產品類型)分組,取每個分組的前50行,查看每個供應商的數量

  2.使用rank函數給每個供應商、每個類型產品的銷售量做個排名,添加偽劣ran

  3.篩選ran小於等於50的行,以供應商、產品類型分組,count

sql:

select gyscode 供應商編碼, typeid 類型id, count(1) num
  from (select t.gyscode,
                t.typeid,
                sum(t.sale) sale,
                rank() over(partition by t.gyscode, t.typeid order by sum(b.sale) desc) ran
           from t_sale t
          where
         -- 計算周期:上月1到上月最后一天
          t.log_date>= add_months(trunc(sysdate, 'mm'), -1)
       and t.log_date<= last_day(add_months(trunc(sysdate, 'mm'), -1))
          group by t.gyscode, t.typeid)
  where ran <= 50
group by gyscode, typeid

 

注:runk函數兩種用法:

  dense_rank:連續排名,如果有兩個供應商的銷售額一樣,排名相同,但是下一個供應商的排名+1

  rank:不連續排名,如果有兩個供應商的銷售額一樣,排名相同,但是下一個供應商的排名+2(2:銷售額相同的供應商數量)

runk函數有兩種排名:

  1.所有結果排名(不加partition,相當於以某個字段排序后的rownum)

  2.分組排名(加partition)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM