SQL查询下一个最低值



我有下表:

_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;

请记住,如果尚未输入记录,则不会给出正确答案。但话说回来,其他任何事情都不会。这将是一个你不需要寻找最新数据的过程。

最新更新