我有下表:
_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
我需要通过使用当前里程表读数,前一个和加仑数来计算燃油里程。我的问题是,如果没有按顺序输入里程表读数(或者如果用户返回改变值1,我该如何计算新的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时,我需要总是抓住下一个最低的里程表读数,该读数应该来自最前面的条目。在某些情况下,如果用户返回并编辑一个,或者可能会跳过一个并在以后添加它,则需要对其进行调整。
这一切都进入了一个Android应用程序,但我主要想知道如何编写SQL。我可能需要做一些If语句并运行所有的值或什么?寻找任何人的输入。
如果您需要进一步说明,请告诉我。
由于
答案 0 :(得分:0)
因为它是一个应用程序,所以您无需一步完成所有操作。我不知道android编程,所以我将向你展示通用代码的逻辑。
currentOdometerReading = 11000;
运行此查询,将上述变量作为参数传递
select gallons,
(select max(odometer)
from yourTable
where odometer < @paramterFromYourApp) prevOdometerReading
where odometer = @paramterFromYourApp
返回您的应用
milesPerGallon = (currentOdometerReading - thePrevOdometerReadingValue from your query)
/ theGallonsValueFromYourQuery;
请记住,如果尚未输入记录,则无法给出正确答案。但话说回来,其他任何事情都没有。这将是一个您不查找最新数据的过程。
答案 1 :(得分:0)
这应该为您提供所需的成分。我不明白你的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小提琴演示: http://sqlfiddle.com/#!7/394d7/36/0
已编辑 - 必须通过案例陈述更改以前的里程表,以便在ID 2上显示0。 再次编辑 - 已通过MPG计算