mysql - 在没有会话变量的情况下对 MySQL 中的分组数据进行排序?
问题描述
我的数据如下所示:
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 是唯一的订单
item_id 是产品代码
为了进一步解释,前三行来自客户 #1 的第一个订单 (order_id = 1),此人订购了 3 个不同的项目(10、24 和 37)。然后他们又购买了另外两个产品的订单 (order_id =2)。customer_id =2 的人有 2 个唯一订单(4 和 6),而 ID 为“4”的客户有一个唯一订单(order_id =6)
本质上,我需要做的是按 customer_id 和 order Id 对这些订单进行排名,这样我就可以说“Order_id = 7 是 customer_id = 2 的第二个订单,因为 Order_rank = 2”
这里的挑战是我不能在 MySQL 查询中使用会话变量(例如 @grp := customer_id )
例如,不允许这样的查询:
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
谢谢您的帮助!
解决方案
在相关子查询中,我们可以使用特定行的唯一值和先前值Count(..)
来确定排名 。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 |
推荐阅读
- html - Bootstrap 4 内嵌导航栏表单
- eclipse - 从 Eclipse IDE 连接到 Netsuite 时出现 javax/xml/soap/SOAPException
- javascript - 这是什么类型的数组?我如何返回它的第一个索引号?
- css - 情感 UI:模板文字在关键帧中不起作用?
- javascript - 如何在单个语句中应用多个索引
- excel - 根据列标题将数据从一个工作簿转移到另一个工作簿
- java - RLE 图像的功能无法正常工作
- ts-jest - 在 nx 中使用 jest 时找不到模块
- c# - 通过 C# 中的接口使用泛型类型的模型
- google-sheets - 有没有办法知道 BSC 钱包的全部余额?