Given the current trend, when will I reach my ideal weight ? I’ve been recording my weight for a while now, and trying to ge to my ideal weight. This is a slow process and takes a lot of time. In order to see the light at the end of the tunnel, I started trying to project given the current weight loss streak, when would I reach my ideal weight. It’s a mater of performing a linear regression over the exiting data. I record my weight multiple times a day, mostly because the Viva OMRON scale I have seems to be kind of flaky, and I average it over the day. To graph the current streak data I would need the list of day averages relative to the start date: SELECT avg(weight) AS weight, DATEDIFF(date(record_date), start_date) AS day FROM weight_log WHERE record_date > @start_date GROUP BY date(record_date); The slope formula is: \[slope = \frac{\sum{(y - \overline{y}) (x - \overline{x})}}{\sum{(x - \overline{x})^2}}\] The intercept formula is: \[intercept = \overline{y} - slope \cdot \overline{x}\] The formula for linear regression slope needs the average of both X and Y axis. SELECT avg(weight) AS weight_average, avg(day) AS day_average FROM ( SELECT avg(weight) AS weight, DATEDIFF(date(record_date), @start_date) AS day FROM weight_log WHERE record_date > @start_date GROUP BY date(record_date) ) AS A; Since we will need the data in several places, let’s use stored procedure and save it in memory table for reuse. DELIMITER // DROP PROCEDURE IF EXISTS get_weight_slope // CREATE PROCEDURE get_weight_slope( IN start_date DATE ) BEGIN DECLARE weight_average DECIMAL(10,3); DECLARE days_average DECIMAL(10,2); SET @@session.sql_notes = 0; DROP TEMPORARY TABLE IF EXISTS weight_slope_information; CREATE TEMPORARY TABLE weight_slope_information engine=memory SELECT avg(weight) AS weight, DATEDIFF(date(record_date), start_date) AS day FROM weight_log WHERE record_date > start_date GROUP BY date(record_date); SELECT avg(weight), avg(day) INTO weight_average, days_average FROM weight_slope_information; SELECT sum((weight - weight_average)*(day - days_average)) / sum((day-days_average)*(day - days_average)) AS slope, weight_average - sum((weight - weight_average)*(day - days_average)) / sum((day-days_average)*(day - days_average)) * days_average AS intercept FROM weight_slope_information; END // With the returned information you can compute the number of days from start that will be needed to reach a specific weight: \[days = target - \frac{intercept}{slope}\]