x
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", "Order_XYZ", "2020-05-18", "0", "315"),
("Item_01", "Order_MTE", "2020-08-15", "400", "0"),
("Item_01", "Order_MTE", "2020-08-23", "0", "120"),
("Item_01", "Order_OBD", "2020-08-21", "500", "0"),
("Item_01", "Order_OBD", "2020-11-17", "0", "380"),
("Item_02", "Order_TLP", "2020-02-02", "500", "0"),
("Item_02", "Order_TLP", "2020-02-10", "0", "175"),
("Item_02", "Order_SNE", "2020-02-03", "900", "0"),
("Item_02", "Order_SNE", "2020-03-18", "0", "620"),
("Item_02", "Order_ADF", "2020-03-27", "100", "0"),
("Item_02", "Order_ADF", "2020-03-28", "0", "30"),
("Item_02", "Order_ZGO", "2020-04-15", "375", "0"),
("Item_02", "Order_ZGO", "2020-04-17", "0", "120"),
("Item_03", "Order_BBI", "2020-03-12", "700", "0"),
("Item_03", "Order_BBI", "2020-10-25", "0", "280"),
("Item_04", "Order_DXR", "2020-12-09", "260", "0"),
("Item_04", "Order_DXR", "2020-12-15", "0", "110");
Expected Result:
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
In the results above I want to create a descending list of all orderIDs
per itemID
.
Starting from the newest order to the oldest order which is defined by the event_date
.
The position of an orderID
within a certain itemID
should be displayed in column position
.
I tried to go with this query but could not make it work:
SELECT
itemID,
orderID,
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;
What do I need to change to get the expected result?
Advertisement
Answer
You must partition by itemid
and order by MAX(event_date) DESC
in the ROW_NUMBER()
window function:
SELECT itemID, orderID,
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;
See the demo.
Results:
> 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