【问题标题】:Calculate Mileage of Vehicles by Subtracting from Vehicle Readings通过从车辆读数中减去来计算车辆的里程
【发布时间】:2015-07-25 13:13:50
【问题描述】:

我有一个表格,其中定期存储车辆里程,即车辆的里程。

The table:
----------
ID (primary key)
Vehicle_id 
date_of_reading (datetime)
Mileage

到月底,我想选择过去一个月的最后读数并从本月的最后读数中减去它,以获得所有车辆行驶的总公里数。

http://sqlfiddle.com/#!9/34b8b

表格结构

CREATE TABLE `tbl_readings` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `vehicle_id` int(11) NOT NULL,
 `km_driven` int(11) NOT NULL,
 `dt_of_reading` datetime NOT NULL,
  `dt_of_entry` datetime NOT NULL,
  `entry_user` varchar(50) NOT NULL,   PRIMARY KEY (`id`),
  KEY `vehicle_id` (`vehicle_id`),  CONSTRAINT `tbl_readings_ibfk_1`     FOREIGN KEY (`vehicle_id`) REFERENCES `table_vehicle_info` (`id`) ON DELETE     CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=394     DEFAULT CHARSET=latin1

几乎每天都会在此表中发布车辆仪表读数。到月底,这些读数将用于计算车辆行驶的公里数。公里数必须通过取上个月的最后读数并从当前月份的最后读数中减去来计算。

我希望现在更清楚了。我意识到我的问题太模棱两可了。

【问题讨论】:

  • 请为您的表添加CREATE TABLE 语句。
  • @jpw 因为它比一堵墙更容易阅读,比自然语言更不模棱两可,如果你愿意的话,更容易尝试:)
  • 请使用示例数据和所需结果编辑您的问题。措辞模棱两可。
  • @jpw 提出了一个关于 (last, last) 和 (first, last) 的好观点。据我们所知,2015 年 6 月的最后一次读数是 6 月 24 日。现在您进入 2015 年 7 月,第一次阅读是 7 月 10 日。请清理问题
  • 谢谢@DrewPierce,我回答错了问题。

标签: mysql sql


【解决方案1】:

巨大的免责声明:这带有没有保修,但如果我理解你的问题并且我某处没有错,请考虑以下内容。

你的桌子是

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 |
+------+------------------------------------+

【讨论】:

    【解决方案2】:

    我也有同样的问题。看起来我用以下代码解决了它:

    SELECT Main.vehicle_id, Main.latestreading as currentmileage, Link.latestReadin as previousmilage 
    FROM (SELECT m1.*, max(l1.rowid) as LinkID
    FROM `foo` as m1
    JOIN `foo` as l1
    ON l1.vehicle_id= m1.vehicle_id
    WHERE l1.date< m1.date
    GROUP BY m1.rowid
    ORDER BY m1.rowid desc) as Main
    LEFT JOIN (SELECT * FROM `foo`) as Link
    ON Link.rowid = Main.LinkID
    

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多