Рейтинг и порядок SQL

Я работаю с набором данных, в котором я ищу, чтобы получить #1 продавца для каждого class_rk, проданного с SKU драйвера, за которым следует #2 продавца в каждом class_rk и т. Д. Class_rk (который связан с sold_sku) имеет уже был идентифицирован в предыдущем запросе. Вот набор данных:

 driver_sku sold_sku    class_rk    sold_units
 555        432           1         20
 555        235           2         17
 555        322           2         15
 555        253           1         14
 555        152           3         13
 555        732           1          9
 555        913           3          6

Вывод я бы искал:

 driver_sku sold_sku    class_rk    sold_units
 555        432           1         20
 555        235           2         17
 555        152           3         13
 555        253           1         14
 555        322           2         15
 555        913           3          6
 555        732           1          9

Вот код, который я пробовал до сих пор:

 select driver_sku, sold_sku, class_rk, sold_count,
 row_number() over(partition by driver_item_id order by class_rk, sold_count  desc) as rank from data_table;

2 ответа

Решение

Исходя из того, как вы описываете проблему, вы, кажется, хотите разделить class_rk:

select driver_sku, sold_sku, class_rk, sold_count,
       row_number() over(partition by driver_item_id, class_rk
                         order by sold_count desc
                        ) as rank
from data_table;

Однако это не соответствует желаемым результатам.

РЕДАКТИРОВАТЬ:

Исходя из того, как вы описываете проблему, вы, кажется, хотите разделить class_rk и изменить order by:

select t.*
from (select driver_sku, sold_sku, class_rk, sold_count,
             row_number() over (partition by driver_item_id, class_rk
                                order by sold_count desc
                               ) as rank
      from data_table
     ) t
order by rank, class_rk

Если вы действительно хотите перечислить их:

select t.*,
       row_number() over (partition by driver_sku, rank
                          order by sold_count desc) as newcol
from (select driver_sku, sold_sku, class_rk, sold_count,
             row_number() over (partition by driver_item_id, class_rk
                                order by sold_count desc
                               ) as rank
      from data_table
     ) t
order by rank, class_rk

Судя по вашим комментариям, кажется, что вы просто хотите одну запись для каждого class_rk. Я думаю, что это может быть то, что вы ищете:

SELECT driver_sku, sold_sku, class_rk, max(sold_count)
FROM <TABLE>
GROUP BY driver_sku, class_rk
ORDER_BY class_rk

Однако, если вы хотите, чтобы порядок был таким же, как в вашем вопросе, я думаю, вам придется сделать что-то вроде этого:

with ranked as (
    SELECT driver_sku, sold_sku, class_rk, sold_count,
        row_number() over(partition by driver_sku, class_rk order by sold_count desc) as rank
    FROM <TABLE>    
)

SELECT driver_sku, sold_sku, class_rk, sold_count
FROM ranked
GROUP BY driver_sku, rank
ORDER BY class_rk
Другие вопросы по тегам