Enorm fet ansvarsfriskrivning: Detta kommer med nej garanti, men om Jag har förstått ditt problem och Jag har inte fel någonstans, tänk på följande.
Ditt bord är
CREATE TABLE `foo` (`id` INTEGER, `date` DATE, `mileage` INT);
Ett möjligt sätt är att först skapa en vy med datumet för förra månadens senaste läsning (som du kan göra om till en annan kapslad SELECT
om du är så benägen):
CREATE VIEW `past_month_readings`
AS (SELECT `id`,
max(`date`) AS `latestreading`
FROM `foo`
WHERE MONTH(`date`) = MONTH(NOW())-1
GROUP BY `id`);
Följt av
SELECT `currentmileages`.`id`, `currentmileage`-`previousmileage` FROM
(SELECT `foo`.`id`, `mileage` AS `currentmileage`
FROM `foo`
JOIN (SELECT `id`, MAX(`date`) AS `latestreading` FROM `foo` GROUP BY `id`)
AS `baz`
ON `foo`.`id` = `baz`.`id`
AND `foo`.`date` = `baz`.`latestreading`
)
AS `currentmileages`
JOIN
(SELECT `foo`.`id`, `mileage` AS `previousmileage`
FROM `foo`
JOIN `past_month_readings`
ON `foo`.`id`=`past_month_readings`.`id`
AND `foo`.`date` = `past_month_readings`.`latestreading`)
AS `previousmileages`
ON
`currentmileages`.`id` = `previousmileages`.`id`
För
+------+------------+---------+
| id | date | mileage |
+------+------------+---------+
| 1 | 2015-06-15 | 1234 |
| 1 | 2015-07-15 | 1444 |
| 1 | 2015-07-25 | 2000 |
| 2 | 2015-06-01 | 100 |
| 2 | 2015-06-20 | 200 |
| 2 | 2015-07-20 | 300 |
+------+------------+---------+
detta resulterar i
+------+------------------------------------+
| id | `currentmileage`-`previousmileage` |
+------+------------------------------------+
| 1 | 766 |
| 2 | 100 |
+------+------------------------------------+