为每个项目创建订单的降序列表,并在单独的列中显示排名位置

问题描述

DB-Fiddle

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) DESCROW_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