Рейтинг и порядок 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