我们需要帮助才能找到像......这样的数据
- 在多长时间内,“ 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%。
答案 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