случай, когда основано на значении groupdens_rank() и значении row_number()

вот задача, которую мне дали, чтобы получить qty(количество) на основе outer_index_group, которые я получаю от dense_rank col1,col2,col3 и inner_index_group от row_number из col1,col2,col3 .

Тут правила:

1) внутри каждого outer_index_group, если col4 имеет 4055 и 4086, qty я должен получить в строке inner_index_group 4086, которая обычно в inner_index_group 3 или 2.

2- иначе, если col4 имеет только 4055, получить количество непосредственно из строки.

пример данных

результат будет таким: введите здесь описание изображения

Как ты думаешь, я это сделаю? Я думаю о case when, но понятия не имею, что делать в этой ситуации.

Большое спасибо.

    SELECt col1,col2,col3,col4,qty
         ,dense_rank() over (order by col1,col2,col3) as outer_index_group
   , ROW_NUMBER() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group from table

person user2300035    schedule 10.03.2015    source источник
comment
какой sql-запрос у вас сейчас?   -  person ASh    schedule 10.03.2015
comment
@ASh есть идеи, как это решить?   -  person user2300035    schedule 10.03.2015


Ответы (1)


select * from
(
    select col1,col2,col3,col4,qty
          ,dense_rank() over (order by col1,col2,col3) as outer_index_group
          ,row_number() over (partition by col1,col2,col3 order by col1,col2,col3) as      inner_index_group
          ,RANK() over (partition by col1,col2,col3 order by col1,col2,col3,col4 desc) as rnk
          from myTable
) T
where rnk = 1

важной частью здесь является Rank() over (..., col4 desc). он назначит наивысший ранг 1 строкам с максимальным значением в каждом разделе col1, col2, col3. поэтому, если в разделе есть строки с col4=4086, они получат ранг 1, а остальные с col4=4055 получат ранг 2; если таких строк нет в некоторых разделах, строки с col4=4055 получат там ранг 1.

rank() можно заменить на row_number(), если вам нужна только 1 строка для каждого раздела (rank() может присвоить rnk=1 нескольким строкам)

person ASh    schedule 10.03.2015