Использование функции ранга в Join - PullRequest
0 голосов
/ 27 июня 2018

Я использую приведенный ниже код оракула, чтобы найти 5 лучших магазинов, в которых продается больше всего товаров. Все, что находится после этих 5 хранилищ, должно быть сгруппировано в «другой» ранг 6 ранга. Run_id и scene_ID имеют отношение один к одному. Этот код работает, когда есть только один run_id и один script_id. Этот код прекрасно работает, когда у меня есть только один run_id и один script_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 голосов
/ 27 июня 2018

Кто-то написал мне ответ на мой вопрос. Мне нужно было ранжировать как по script_id, так и по item_qty.

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