在加入中使用排名功能

时间:2018-06-27 13:43:31

标签: sql oracle plsql ranking

我正在使用下面的Oracle代码来查找销售量最大的前5家商店。这5个存储库之后的所有内容都应归为一个“其他”存储桶等级6。Run_id和censage_ID具有一对一的关系。当只有一个run_id和一个case_id时,此代码有效。当我只有一个run_id和一个case_id时,此代码非常有用。但是,为了提高效率,我只希望在查询时才将每种情况的前5名提升到最高。当我这样做时,第一个run_id将显示前5个链条以及所有其他存储桶,之后的每个run_id仅显示排名为6的所有其他存储桶。

SELECT c.SCENARIO_ID, case when C.YEAR_MONTH_NBR >= to_char(r.proj_start_dt,'YYYYMM') then 'G' else 'L' End as overUnd, case when rnk <= 5 then c.model_nme else 'Other' end as Chain_Nme, sum(c.item_qty), case when rnk <= 5 then rnk else 6 end as final_rank
  from USR.pdr_summary c
  Left Outer Join run_tbl r on c.run_id = r.run_id
  Left join (SELECT c.scenario_id, c.model_nme, rank () over (order by c.scenario_id, sum(C.item_qty) desc) as Rnk
     from USR.pdr_summary c
     where c.run_id IN ('1110','1111','1112','1113')
         and c.scenario_id IN('5423','5424','5425','5426')
         and c.model_nme <> 'Other Retail'
     group by c.scenario_id, c.model_nme) rank_data
     on rank_data.model_nme = c.model_nme
      and rank_data.scenario_id = c.scenario_id
     where c.run_id IN ('1110','1111','1112','1113')
         and c.scenario_id IN('5423','5424','5425','5426')
  group by c.SCENARIO_ID, case when C.YEAR_MONTH_NBR >= to_char(r.proj_start_dt,'YYYYMM') then 'G' else 'L' End, case when rnk <= 5 then c.model_nme else 'Other' end, case when rnk <= 5 then rnk else 6 end
     order by c.SCENARIO_ID, overUnd, case when rnk <= 5 then rnk else 6 end asc

当我从排名数据查询中删除and rank_data.scenario_id = c.scenario_id行时,在某些情况下,我将获得所有6个排名,而在其他情况下,我将获得排名1、3、5和6或1,2,4和6

我认为这与我进行联接的方式有关,但是我不知道为什么吗?

我想要的结果如下:

Scenario_id OverUnd Chain_nme   item_qty    rank
5423    G   Walmart        1000     1
5423    G   Amazon          950     2
5423    G   Target      750     3
5423    G   Walgreens   600     4
5423    G   CVS     500     5
5423    G   Other       800     6
5423    L   Trader Joe  1000        1
5423    L   Amazon          950     2
5423    L   Target      750     3
5423    L   Walgreens   600     4
5423    L   Walmart         500     5
5423    L   Other       800     6
5424    G   Walgreens   1000        1
5424    G   Amazon          950     2
5424    G   Target      750     3
5424    G   Walmart         600     4
5424    G   CVS     500     5
5424    G   Other       800     6
5424    L   Trader Joe  1000        1
5424    L   Amazon          950     2
5424    L   Target      750     3
5424    L   Walgreens   600     4
5424    L   Walmart         500     5
5424    L   Other       800     6

我得到的是:

Scenario_id OverUnd Chain_nme   item_qty    rank
5423        G       Walmart 1000        1
5423        G       Amazon  950     2
5423        G       Target      750     3
5423        G       Walgreens   600     4
5423        G       CVS     500     5
5423        G       Other       800     6
5423        L       Trader Joe  1000        1
5423        L       Amazon  950     2
5423        L       Target      750     3
5423        L       Walgreens   600     4
5423        L       Walmart 500     5
5423        L       Other       800     6
5424        G       Other       700     6
5424        L       Other       900     6
5425        G       Other       700     6
5425        L       Other       900     6
5426        G       Other       700     6
5426        L       Other       900     6

对不起,我不确定在复制/粘贴数据时如何使其看起来像表格。

1 个答案:

答案 0 :(得分:0)

有人通过电子邮件将我的问题的答案发送给我。我需要按case_id和item_qty进行排名。

(partition by c.scenario_id order by c.scenario_id, sum(C.item_qty) desc) as Rnk