विशाल वसा अस्वीकरण: यह नहीं के साथ आता है वारंटी, लेकिन अगर मैंने आपकी समस्या को समझ लिया है और मैं कहीं गलत नहीं हूँ, निम्नलिखित पर विचार करें।
आपकी तालिका
. हैCREATE TABLE `foo` (`id` INTEGER, `date` DATE, `mileage` INT);
एक संभावित तरीका यह है कि पहले पिछले महीने की नवीनतम रीडिंग की तारीख के साथ एक दृश्य बनाएं (जिसे आप दूसरे नेस्टेड SELECT
में बदल सकते हैं। यदि आप इतने इच्छुक हैं):
CREATE VIEW `past_month_readings`
AS (SELECT `id`,
max(`date`) AS `latestreading`
FROM `foo`
WHERE MONTH(`date`) = MONTH(NOW())-1
GROUP BY `id`);
इसके बाद
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`
. के लिए
+------+------------+---------+
| 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 |
+------+------------+---------+
इसका परिणाम
. होता है+------+------------------------------------+
| id | `currentmileage`-`previousmileage` |
+------+------------------------------------+
| 1 | 766 |
| 2 | 100 |
+------+------------------------------------+