SQL查询下一个最低值

时间:2014-02-17 21:59:47

标签: android sql sqlite

我有下表:

_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语句并运行所有的值或什么?寻找任何人的输入。

如果您需要进一步说明,请告诉我。

由于

2 个答案:

答案 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计算