MySQL查询获取平均数据消耗

时间:2017-01-12 11:41:38

标签: mysql sql database

我们需要帮助才能找到像......这样的数据 - 在多长时间内,“ size ”值的“类型”abc将触及“”数字(本例中为50)。

  
      
  • 类型“abc”的大小每天都在增加。
  •   
  • 单个日期中可能有多个条目
  •   
  • “type”栏
  • 栏中可能有多个值   

表消耗

DateTime   |Type | size |total | seq_id
12-01-2016 | abc |   15 |   50 | 3
13-01-2016 | abc |   16 |   50 | 4
13-01-2016 | abc |   16 |   50 | 5
14-01-2016 | abc |   20 |   50 | 6
14-01-2016 | pqr |   10 |   50 | 7
15-01-2016 | abc |   25 |   50 | 8

输出:abc将在n天内触及50天,基于每日消费的平均值n%。

1 个答案:

答案 0 :(得分:3)

解决这个问题的难题是一个很好的挑战。 但我想我已经得到了你需要的答案。

创建表/插入数据

CREATE TABLE consume
    (`DateTime` VARCHAR(10), `Type` VARCHAR(3), `size` INT, `total` INT, `seq_id` INT)
;

INSERT INTO consume
    (`DateTime`, `Type`, `size`, `total`, `seq_id`)
VALUES
    ('12-01-2016', 'abc', 15, 50, 3),
    ('13-01-2016', 'abc', 16, 50, 4),
    ('13-01-2016', 'abc', 16, 50, 5),
    ('14-01-2016', 'abc', 20, 50, 6),
    ('14-01-2016', 'pqr', 10, 50, 7),
    ('15-01-2016', 'abc', 25, 50, 8)
;

您遇到的问题是获取所需的数据,以便计算日期之间的差异。 请注意,此查询必须按顺序才能使此查询正常运行。如14-01-2016,15-01-2016,16-01-2016,(....)

SELECT DISTINCT
         consume1.Type
       , consume1.DateTime
       , consume1.size  
       , consume2.DateTime
       , consume2.size
       , (consume2.size - consume1.size) size_diff
     FROM 
      consume consume1
     INNER JOIN 
       consume consume2
     ON 
       consume1.DateTime < consume2.DateTime
     WHERE
        consume1.type = 'abc'
      AND
        consume2.type = 'abc'
      AND
       ((consume2.DateTime - consume1.DateTime) = 1) 
     ORDER BY 
      consume1.seq_id ASC 

结果

Type    DateTime      size  DateTime      size  size_diff  
------  ----------  ------  ----------  ------  -----------
abc     12-01-2016      15  13-01-2016      16            1
abc     13-01-2016      16  14-01-2016      20            4
abc     14-01-2016      20  15-01-2016      25            5

现在您拥有了正确的数据,您可以使用此查询计算每日平均尺寸增长。 它使用上面的查询作为传递表。但它只选择你需要的字段。

 SELECT 
       TYPE
     , AVG(size_diff) daily_avg_growth
    FROM (
     SELECT DISTINCT
          consume1.Type
       , (consume2.size - consume1.size) size_diff
     FROM 
      consume consume1
     INNER JOIN 
       consume consume2
     ON 
       consume1.DateTime < consume2.DateTime
     WHERE
        consume1.type = 'abc'
      AND
        consume2.type = 'abc'
      AND
       ((consume2.DateTime - consume1.DateTime) = 1) 
     ORDER BY 
      consume1.seq_id ASC 
    ) AS consume_per_day_filter 

<强>结果

Type    daily_avg_growth  
------  ------------------
abc     3.3333            

现在你知道了abc类型的每日平均增长率。 现在我们可以使用此查询计算所需的天数((总 - [最大尺寸])/ [每日平均增长])((50 - 25)/ 3.3333)= 7.5天。注意香港专业教育学院在查询中使用CEIL,结果是8天 它使用上面的查询作为交付表。

SELECT 
   consume.Type
 , CEIL((consume.total - MAX(consume.size)) / daily_avg_growth) "days_needed_to_50"
FROM 
 consume
CROSS JOIN (
  SELECT 
     TYPE
   , AVG(size_diff) daily_avg_growth
  FROM (
   SELECT DISTINCT
      consume1.Type
    , (consume2.size - consume1.size) size_diff
   FROM 
    consume consume1
   INNER JOIN 
     consume consume2
   ON 
     consume1.DateTime < consume2.DateTime
   WHERE
     consume1.type = 'abc'
   AND
     consume2.type = 'abc'
   AND
     ((consume2.DateTime - consume1.DateTime) = 1)  
   ORDER BY 
    consume1.seq_id ASC 
  )
    AS consume_per_day_filter 
)
  AS consume_per_day_filter_sum
WHERE
 consume.type = 'abc'  

<强>结果

Type    days_needed_to_50  
------  -------------------
abc                       8