我有下表:
_id price gallons odometer
1 3.19 15 10000
2 3.25 13.2 10200
3 3.24 14.8 10400
4 3.31 15.3 10600
5 3.31 12.8 11000
6 3.29 12.9 10800
7 3.32 14.3 10900
8 3.28 15.1 11200
9 3.27 11.7 11400
10 3.21 14.7 11600
我需要使用当前的里程表读数、以前的读数和加仑数来计算燃油里程。我的问题是,如果里程表读数没有按顺序输入(或者如果用户返回更改一的值,我如何计算新的MPG?)
示例:
_id price gallons odometer
1 3.19 10 10000 <-- First entry has no MPG rating since there is no previous data
2 3.25 10 10200 <-- 20 MPG based off the difference of row 2 & 1 and 10 gallons
3 3.24 10 10400 <-- 20 MPG based off the difference of row 3 & 2 and 10 gallons
4 3.31 10 10600 <-- 20 MPG based off the difference of row 4 & 3 and 10 gallons
5 3.31 10 11000 <-- This row will initially show 40MPG difference of row 5 & 4 (since row 6 isnt in yet)
6 3.29 10 10800 <-- once this is entered, it goes to 20MPG difference of 6 & 4 (4 is next lowest odometer reading after 6) and then 10 becomes 20MPG difference from 5 & 6
我想你可以看到我要做什么。从里程计列中,当我计算MPG时,我需要始终获取下一个最低的里程计读数,该读数应该来自最前面的条目。在某些情况下,如果用户返回并编辑一个,或者可能跳过一个并在以后添加,则需要对此进行调整。
这一切都将进入安卓应用程序,但我主要好奇SQL是如何编写的。我可能需要做一些If语句,并运行所有的值或其他什么?正在查找任何人的输入。
如果你需要进一步澄清,请告诉我。
感谢
这应该能为您提供所需的成分。我不理解你的MPG计算,但它将当前和以前的里程表和加仑值放在同一行,这应该允许你做你需要做的事情。
select x.*,
y.odometer as prev_odom,
y.gallons as prev_gallons,
(x.odometer - y.odometer) / x.gallons as mpg
from tbl x, tbl y
where y.odometer =
(select max(z.odometer) from tbl z where z.odometer < x.odometer)
union
select x.*, null, null, null
from tbl x
where id = 1
order by 1
SQL Fiddle演示:http://sqlfiddle.com/#!7/394d7/36/0
已编辑-必须更改以前的里程表,通过案例说明在ID 2上显示0。再次编辑-内部MPG计算
因为它是一个应用程序,所以不必一步到位。我不知道android编程,所以我将向您展示通用代码的逻辑。
currentOdometerReading = 11000;
运行此查询,将上面的变量作为参数传递
select gallons,
(select max(odometer)
from yourTable
where odometer < @paramterFromYourApp) prevOdometerReading
where odometer = @paramterFromYourApp
返回到您的应用
milesPerGallon = (currentOdometerReading - thePrevOdometerReadingValue from your query)
/ theGallonsValueFromYourQuery;
请记住,如果尚未输入记录,则不会给出正确答案。但话说回来,其他任何事情都不会。这将是一个你不需要寻找最新数据的过程。