如何解决为每个项目创建订单的降序列表,并在单独的列中显示排名位置
CREATE TABLE operations (
id int auto_increment primary key,orderID VARCHAR(255),itemID VARCHAR(255),event_date DATE,order_volume INT,shipped_volume INT
);
INSERT INTO operations
(itemID,orderID,event_date,order_volume,shipped_volume
)
VALUES
("Item_01","Order_XYZ","2020-05-01","600","0"),("Item_01","2020-05-18","0","315"),"Order_MTE","2020-08-15","400","2020-08-23","120"),"Order_OBD","2020-08-21","500","2020-11-17","380"),("Item_02","Order_TLP","2020-02-02","2020-02-10","175"),"Order_SNE","2020-02-03","900","2020-03-18","620"),"Order_ADF","2020-03-27","100","2020-03-28","30"),"Order_ZGO","2020-04-15","375","2020-04-17",("Item_03","Order_BBI","2020-03-12","700","2020-10-25","280"),("Item_04","Order_DXR","2020-12-09","260","2020-12-15","110");
预期结果:
itemID | orderID | order_volume | shipped_volume | position
------------------|-------------|------------------|-------------------|--------------------
Item_04 | Order_DXR | 260 | 110 | 1
------------------|-------------|------------------|-------------------|--------------------
Item_03 | Order_BBI | 700 | 280 | 1
------------------|-------------|------------------|-------------------|--------------------
Item_02 | Order_ZGO | 375 | 120 | 1
Item_02 | Order_ADF | 100 | 30 | 2
Item_02 | Order_SNE | 900 | 620 | 3
Item_02 | Order_TLP | 500 | 175 | 4
------------------|-------------|------------------|-------------------|---------------------
Item_01 | Order_OBD | 500 | 380 | 1
Item_01 | Order_MTE | 400 | 120 | 2
Item_01 | Order_XYZ | 600 | 315 | 3
在上面的结果中,我想创建一个{strong>降序列表,其中每个orderIDs
的所有itemID
。
从最新订单到由event_date
定义的最旧订单。 orderID
在特定itemID
中的位置应显示在列position
中。
我尝试使用此查询,但无法使其正常工作:
SELECT
itemID,sum(order_volume),sum(shipped_volume),ROW_NUMBER() OVER (PARTITION BY orderID ORDER BY event_date DESC) as position
FROM operations
GROUP BY 1,2
ORDER BY itemID DESC,orderID DESC;
为了获得预期的结果,我需要更改什么?
解决方法
您要按项目而不是按项目进行分区(因为要对项目订单进行排名)。要进行排序,您需要event_date
...和一个汇总函数(因为每个组有两个不同的日期):我使用了MIN()
:
考虑:
SELECT
itemID,orderID,SUM(order_volume) sum_ order_volume,SUM(shipped_volume) sum_ shipped_volume
ROW_NUMBER() OVER (PARTITION BY itemID ORDER BY MIN(event_date) DESC) as position
FROM operations
GROUP BY 1,2
ORDER BY itemID DESC,position
,
您必须在partition by itemid
窗口功能中order by MAX(event_date) DESC
和ROW_NUMBER()
:
SELECT itemID,sum(order_volume) order_volume,sum(shipped_volume) shipped_volume,ROW_NUMBER() OVER (PARTITION BY itemID ORDER BY MAX(event_date) DESC) as position
FROM operations
GROUP BY itemID,orderID
ORDER BY itemID DESC,position;
请参见demo。
结果:
> itemID | orderID | order_volume | shipped_volume | position
> :------ | :-------- | -----------: | -------------: | -------:
> Item_04 | Order_DXR | 260 | 110 | 1
> Item_03 | Order_BBI | 700 | 280 | 1
> Item_02 | Order_ZGO | 375 | 120 | 1
> Item_02 | Order_ADF | 100 | 30 | 2
> Item_02 | Order_SNE | 900 | 620 | 3
> Item_02 | Order_TLP | 500 | 175 | 4
> Item_01 | Order_OBD | 500 | 380 | 1
> Item_01 | Order_MTE | 400 | 120 | 2
> Item_01 | Order_XYZ | 600 | 315 | 3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。