x
CREATE TABLE sales (
id int auto_increment primary key,
customerID VARCHAR(255),
order_date DATE,
sales_volume INT,
returned_volume INT
);
INSERT INTO sales
(customerID, order_date, sales_volume, returned_volume
)
VALUES
("Customer_01", "2020-01-01", "200", "50"),
("Customer_01", "2020-02-15", "400", "120"),
("Customer_01", "2020-02-21", "300", "0"),
("Customer_01", "2020-03-17", "800", "480"),
("Customer_01", "2020-04-08", "600", "315"),
("Customer_02", "2020-02-02", "500", "175"),
("Customer_02", "2020-02-03", "900", "620"),
("Customer_02", "2020-03-27", "100", "30"),
("Customer_02", "2020-04-15", "375", "120"),
("Customer_03", "2020-08-12", "700", "280"),
("Customer_04", "2020-03-09", "260", "110");
Expected Result:
customerID return_rate_last_3_orders
Customer_01 46.76 = (315+480+0) / (600+800+300)
Customer_02 56.00 = (120+30+620) / (375+100+900)
Customer_03 40.00 = (280) / (700)
Customer_04 42.31 = (110) / (260)
In the table above I have orders
per customer
and their corresponding sales_volume
and return_volume
.
Now, I want to calculate the return_rate of the last 3 orders per customer.
So far, I came up with this query:
SELECT
customerID,
SUM(sales_volume),
SUM(returned_volume),
(SUM(returned_volume) / SUM(sales_volume)) AS return_rate
FROM sales
GROUP BY 1
LIMIT 3;
But I have no clue how I can apply the limit
to the calculation of the return_rate
per customer
.
How do I have to modify the query
to achieve the expected results?
Advertisement
Answer
If I understand correctly, you can use ROW_NUMBER()
to enumerate the rows and then filter before aggregating:
SELECT customerID, SUM(sales_volume), SUM(returned_volume),
(SUM(returned_volume) / SUM(sales_volume)) AS return_rate
FROM (SELECT s.*,
ROW_NUMBER() OVER (PARTITION BY customerID ORDER BY order_date DESC) as seqnum
FROM sales s
) s
WHERE seqnum <= 3
GROUP BY 1;
Here is a db<>fiddle.