如何在MySQL中完成75%的任务完成时间
问题描述:
以电子商务场景为例,某些类别的产品数量较多。如何找出75%的产品在每个类别中销售的时间。如何在MySQL中完成75%的任务完成时间
例如,移动类别中有20个Google Pixel(产品),在笔记本类别中有100个Thinkpad,在一天开始时有1000个T恤类别。第15像素在上午6点35分出售,而第20点(当天的最后一天)在上午7点00分出售。 75th Thinkpad在下午2点40分售出,而第91分钟(当天的最后一天)在6点30分售出。第300个发球台由当天发送(没有75%销售)。
事务表:
+----------+------------+-----------+
| ORDER_ID | PRODUCT_ID | SELL_TIME |
+----------+------------+-----------+
| 1 | 1 | 00:00:00 |
+----------+------------+-----------+
| 2 | 1 | 00:00:01 |
+----------+------------+-----------+
| 15 | 1 | 6:35:00 |
+----------+------------+-----------+
| 20 | 1 | 7:00:00 |
+----------+------------+-----------+
| 1 | 2 | 00:30:00 |
+----------+------------+-----------+
| 2 | 2 | 00:35:00 |
+----------+------------+-----------+
| 75 | 2 | 14:40:00 |
+----------+------------+-----------+
| 91 | 2 | 18:30:00 |
+----------+------------+-----------+
| 1 | 3 | 00:30:00 |
+----------+------------+-----------+
| 300 | 3 | 21:30:00 |
+----------+------------+-----------+
静态库存表是:
+------------+-----------+
| PRODUCT_ID | INVENTORY |
+------------+-----------+
| 1 | 20 |
+------------+-----------+
| 2 | 100 |
+------------+-----------+
| 3 | 1000 |
+------------+-----------+
答案是:
+---+---------+
| 1 | 6:35:00|
+---+---------+
| 2 | 14:40:00|
+---+---------+
答
这是非常复杂的,)
CREATE TABLE trans(ORDER_ID int, PRODUCT_ID int , SELL_TIME date);
INSERT trans VALUES (1, 1, '2016-11-30'),
(2, 1, '2016-11-29'),
(3, 1, '2016-11-28'),
(4, 1, '2016-11-27'),
(5, 1, '2016-11-26'),
(6, 1, '2016-11-25'),
(7, 2, '2016-11-24'),
(8, 2, '2016-11-23'),
(9, 2, '2016-11-22'),
(10, 2, '2016-11-21');
CREATE TABLE inventory(PRODUCT_ID int , INVENTORY int);
INSERT inventory VALUES (1 ,6),
(2, 4);
SELECT x.product_id,
Min(
CASE
WHEN rank/inventory >= 0.75 THEN sell_time
ELSE NULL
end) AS sell_time_75pct
FROM (
SELECT (
CASE product_id
WHEN @currproductid THEN @currow := @currow + 1
ELSE @currow := 1
AND @currproductid := product_id
end) AS rank,
product_id,
sell_time,
inventory
FROM (
SELECT trans.product_id,
sell_time,
inventory
FROM trans
INNER JOIN inventory
ON (
inventory.product_id=trans.product_id)
INNER JOIN
(
SELECT @currow := 0,
@currproductid := '') r
order BY product_id ,
sell_time ASC) x) x
GROUP BY product_id;
输入:
ORDER_ID PRODUCT_ID SELL_TIME
1 6 1 25.11.2016 00:00:00
2 5 1 26.11.2016 00:00:00
3 4 1 27.11.2016 00:00:00
4 3 1 28.11.2016 00:00:00
5 2 1 29.11.2016 00:00:00
6 1 1 30.11.2016 00:00:00
7 10 2 21.11.2016 00:00:00
8 9 2 22.11.2016 00:00:00
9 8 2 23.11.2016 00:00:00
10 7 2 24.11.2016 00:00:00
输出:
product_id sell_time_75pct
1 1 29.11.2016 00:00:00
2 2 23.11.2016 00:00:00
答
下面是我测试了一个解决方案:
SELECT product_id, sell_time
FROM transaction
INNER JOIN (
SELECT product_id, MIN(order_id) AS order_id
FROM (
SELECT t.order_id, t.product_id,
t.order_id >= FLOOR(i.inventory * 0.75) AS is_gt_75
FROM transaction AS t
INNER JOIN inventory AS i USING (product_id)
) AS _derived1
WHERE is_gt_75
GROUP BY product_id
) AS _derived2 USING (product_id, order_id);
输出:
+------------+-----------+
| product_id | sell_time |
+------------+-----------+
| 1 | 06:35:00 |
| 2 | 14:40:00 |
+------------+-----------+
订单ID不会是连续的。它们是表格的自动增量字段,并且不管类别或日期如何,所有产品都会不断增加。为了简单起见,我是这样写的。 我的歉意@Bill在示例中没有说清楚。 –