2

我有一张有四个字段的表:

trip_paramid, creation_time, fuel_content,vehicle_id

我想找出两行之间的差异。在我的表中,我有一个字段fuel_content。每两分钟我获取数据包并插入数据库。由此我想找出总加油量。如果两个数据包之间的燃料含量大于2,我将其视为加油量。同一天可能发生多次加油。所以我想找出车辆一天的总加油量。我在sqlfiddle中创建了一个表模式和示例数据。谁能帮我找到解决方案。这里是表模式的链接.. http://www.sqlfiddle.com/#!2/4cf36

4

2 回答 2

2

这是一个很好的查询。

查询中注入参数(vehicle_id=13)和(date='2012-11-08'),但它们是需要修改的参数。

您可以注意到我是否使用creation_time<..and creation_time>..in 而不是选择了一个表达式DATE(creation_time)='...',这是因为第一个表达式可以使用“creation_time”上的索引,而第二个则不能。

SELECT
SUM(fuel_content-prev_content) AS refuel_tot
, COUNT(*) AS refuel_nbr
FROM (
  SELECT
  p.trip_paramid
  , fuel_content
  , creation_time
  , (
    SELECT ps.fuel_content
    FROM trip_parameters AS ps
    WHERE (ps.vehicle_id=p.vehicle_id)
    AND (ps.trip_paramid<p.trip_paramid)
         ORDER BY trip_paramid DESC
         LIMIT 1
    ) AS prev_content
  FROM trip_parameters AS p
  WHERE (p.vehicle_id=13)
  AND (creation_time>='2012-11-08')
  AND (creation_time<DATE_ADD('2012-11-08', INTERVAL 1 DAY))
  ORDER BY p.trip_paramid
) AS log
WHERE (fuel_content-prev_content)>2
于 2012-11-12T13:26:35.040 回答
0

测试它:

select sum(t2.fuel_content-t1.fuel_content) TotalFuel,t1.vehicle_id,t1.trip_paramid as rowIdA,
t2.trip_paramid as rowIdB,
t1.creation_time as timeA,
t2.creation_time as timeB, 
t2.fuel_content fuel2,
t1.fuel_content fuel1,
(t2.fuel_content-t1.fuel_content)  diffFuel
from trip_parameters  t1, trip_parameters  t2
where t1.trip_paramid<t2.trip_paramid 
and t1.vehicle_id=t2.vehicle_id 
and t1.vehicle_id=13
and t2.fuel_content-t1.fuel_content>2 
order by rowIdA,rowIdB

其中 (rowIdA,rowIdB) 是所有可能的元组,没有重复,diffFuel 是燃料量之间的差,TotalFuel 是所有燃料量的总和。

该查询比较同一车辆的所有燃料含量差异(在此示例中,对于 id=13 的车辆),并且仅当差异燃料大于 2 时对燃料量求和。

问候。

于 2012-11-12T11:51:02.753 回答