Создать столбец рейтинга в PostgreSQL - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь написать запрос, который вернет рейтинг продукта по бизнес-единицам по общему объему продаж. Ожидаемые столбцы должны включать столбцы: ранг, бизнес-единицы, продукт, продажи. Я могу использовать все столбцы, кроме того, что не понимаю, как создать новый столбец «Ранг».

Это данные, с которыми я работаю:

CREATE TABLE product_sales
(order_line_item_id bigint,
Business_unit varchar(255),
product_name varchar(255),
sales bigint);

INSERT INTO product_sales VALUES
(1, 'Goop Skincare', 'Goop Glow', 100),
(2, 'Goop Skincare', 'Peel Pads', 100),
(3, 'G Label', 'Puff Sleeve Sweatshirt', 200),
(4, 'G Label', 'Puff Sleeve Sweatshirt', 400),
(5, 'Goop Skincare', 'Peel Pads', 100),
(6, 'Goop Skincare', 'Goop Glow', 200),
(7, 'G Label', 'Puff Sleeve Sweatshirt', 100),
(8, 'Goop Skincare', 'G. Tox', 100),
(9, 'Goop Skincare', 'Goop Glow', 300),
(10, 'Goop Skincare', 'G. Tox', 50),
(11, 'Goop Skincare', 'Peel Pads', 100),
(12, 'Goop Skincare', 'Peel Pads', 400),
(13, 'G Label', 'Mel Jeans', 400),
(13, 'G Label', 'Nina dress', 500),
(14, 'G Label', 'Nina dress', 1000),
(15, 'G Label', 'Mel Jeans', 400),
(16, 'Goop Skincare', 'Peel Pads', 400),
(17, 'G Label', 'Alexis Skirt', 350);

Это код, который у меня есть до сих пор

SELECT DISTINCT Business_unit, product_name,
SUM(sales) AS sales
FROM product_sales
GROUP BY Business_unit, product_name
ORDER BY business_unit DESC

Как добавить в столбец рейтинга

1 Ответ

2 голосов
/ 12 февраля 2020

Вы можете использовать оконные функции:

SELECT 
    Business_unit, 
    product_name,
    SUM(sales) AS sales,
    RANK() OVER(ORDER BY SUM(sales) DESC) rnk
FROM product_sales
GROUP BY Business_unit, product_name
ORDER BY rnk, business_unit

Для ваших образцов данных, это дает :

business_unit | product_name           | sales | rnk
:------------ | :--------------------- | ----: | --:
G Label       | Nina dress             |  1500 |   1
Goop Skincare | Peel Pads              |  1100 |   2
G Label       | Mel Jeans              |   800 |   3
G Label       | Puff Sleeve Sweatshirt |   700 |   4
Goop Skincare | Goop Glow              |   600 |   5
G Label       | Alexis Skirt           |   350 |   6
Goop Skincare | G. Tox                 |   150 |   7

Примечания:

  • DISTINCT в запросе GROUP BY является излишним и каким-то образом запутанным (DISTINCT по сути является агрегацией)

  • в зависимости от того, как вы хотите обрабатывать связи, Вы также можете попробовать DENSE_RANK() (или ROW_NUMBER()), которые являются двумя дополнительными функциями ранжирования для RANK()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...