Порядок ранжирования данных в MySQL без переменных сеанса? - PullRequest
0 голосов
/ 21 ноября 2018

Мои данные выглядят так:

Table Name = sales_orders

Customer_id| Order_id| Item_Id
-------------------------------
1          | 1      | 10
1          | 1      | 24
1          | 1      | 37
1          | 2      | 11
1          | 2      | 15
1          | 3      | 28
2          | 4      | 37
4          | 6      | 10
2          | 7      | 10

Однако мне нужно, чтобы они выглядели так:

Customer_id| Order_id| Item_Id |Order_rank
------------------------------------------
1          | 1      | 10       |    1   
1          | 1      | 24       |    1
1          | 1      | 37       |    1
1          | 2      | 11       |    2
1          | 2      | 15       |    2
1          | 3      | 28       |    3
2          | 4      | 37       |    1
4          | 6      | 10       |    1
2          | 7      | 10       |    2

Customer_Id - уникальный человек

Order_id isуникальный заказ

item_id - это код продукта

Для дальнейшего объяснения, первые три строки относятся к первому заказу клиента № 1 (order_id = 1), где этот человек заказал 3 разных товара (10,24 и 37).Затем они приобрели другой заказ (order_id = 2) с двумя другими продуктами.У человека с customer_id = 2 есть 2 уникальных заказа (4 и 6), в то время как у клиента с идентификатором '4' есть один уникальный заказ (order_id = 6)

По сути, мне нужно ранжировать эти заказы по customer_idи идентификатор заказа, так что я могу сказать: «Order_id = 7 - это второй заказ для customer_id = 2, потому что Order_rank = 2»

Проблема в том, что я не могу использовать переменные сеанса (например, @grp:= customer_id) в запросе MySQL

Например, такой запрос НЕ разрешен:

SELECT 
customer_id,
order_id,
@ss := CASE WHEN @grp = customer_id THEN @ss + 1 ELSE 1 END AS 
order_rank,
@grp := customer_id 
FROM 
(
SELECT 
customer_id,
order_id
FROM sales_orders
GROUP BY customer_id, order_id
ORDER BY customer_id, order_id ASC
) AS t_1
CROSS JOIN (SELECT @ss := 0, @grp = NULL)ss

ORDER BY customer_id asc

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

В коррелированном подзапросе мы можем Count(..) уникальные и *1004* значения order_id для конкретной строки customer_id и order_id для определения ранга.

Нам нужно подсчитать уникальные значения, поскольку у вас есть несколько строк в заказе (из-за нескольких элементов).


Запрос

SELECT 
  t1.Customer_id, 
  t1.Order_id, 
  t1.Item_Id, 
  (SELECT COUNT(DISTINCT t2.Order_id) 
   FROM sales_orders t2 
   WHERE t2.Customer_id = t1.Customer_id AND 
         t2.Order_id <= t1.Order_id
  ) AS Order_rank 
FROM sales_orders AS t1;

Результат

| Customer_id | Order_id | Item_Id | Order_rank |
| ----------- | -------- | ------- | ---------- |
| 1           | 1        | 10      | 1          |
| 1           | 1        | 24      | 1          |
| 1           | 1        | 37      | 1          |
| 1           | 2        | 11      | 2          |
| 1           | 2        | 15      | 2          |
| 1           | 3        | 28      | 3          |
| 2           | 4        | 37      | 1          |
| 4           | 6        | 10      | 1          |
| 2           | 7        | 10      | 2          |

Просмотр на БД Fiddle

0 голосов
/ 21 ноября 2018

Вы можете использовать коррелированный подзапрос:

select so.*,
       (select count(*)
        from sales_orders so2
        where so2.Customer_id = so.Customer_id and
              so2.order_id <= so.order_id
       ) as rank_order
from sales_orders so;

Или в MySQL 8 +:

select so.*,
       dense_rank() over (partition by Customer_Id order by Order_Id) as rank_order
from sales_orders so;
...