2016-12-04 45 views
0

以电子商务场景为例,某些类别的产品数量较多。如何找出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| 
+---+---------+ 

回答

1

这是非常复杂的,)

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 
0

下面是我测试了一个解决方案:

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 | 
+------------+-----------+ 
+0

订单ID不会是连续的。它们是表格的自动增量字段,并且不管类别或日期如何,所有产品都会不断增加。为了简单起见,我是这样写的。 我的歉意@Bill在示例中没有说清楚。 –