The following will give you information pretty much as your example: car, start date, end date, distance.
SELECT m1.Car, m2.Date AS StartDate, m1.Date AS endDate, m1.od_reading - m2.od_reading AS distance FROM mileage AS m1 JOIN mileage AS m2 ON m2.rowid = (SELECT rowid FROM mileage m3 WHERE m3.Date < m1.Date AND m3.car = m1.car ORDER BY Date DESC LIMIT 1) WHERE Distance IS NOT NULL; You can add an additional "AND CAR ='foo'" if you only want data about foo. Note: this uses the rowid, which is a SQLite specific feature, as a match on the join because it's slightly more efficient. You could also have the join condition stated in more general SQL terms as: JOIN mileage AS m2 ON m2.car = m1.car AND m2.Date = (SELECT Date FROM mileage m3 WHERE m3.Date < m1.Date AND m3.car = m1.car ORDER BY Date DESC LIMIT 1) On Thu, 20 Dec 2018 at 19:48, Jungle Boogie <jungleboog...@gmail.com> wrote: > On Thu 20 Dec 2018 6:26 PM, Barry Smith wrote: > > > > > > > On 20 Dec 2018, at 4:21 pm, Jungle Boogie <jungleboog...@gmail.com> > wrote: > > > > > > Hi All, > > > > > > Some sample data: > > > 2018/04/15,foo,170644 > > > 2018/04/15,bar.69625 > > > 2018/04/22,foo,170821 > > > 2018/04/22,bar,69914 > > > 2018/04/29,foo,171006 > > > 2018/04/29,bar,70123 > > > 2018/05/06,foo,171129 > > > 2018/05/06,bar,70223 > > > 2018/05/09,foo,171178 > > > 2018/05/20,foo,171304 > > > 2018/05/20,bar,70517 > > > > > > > I wouldn't call my solution elegant, but if you put a unique constraint > on the "date" column, and want your query to return null if there is not a > record exactly on that date: > > > > SELECT > > (SELECT od_reading FROM mileage WHERE date = '2018/05/20' AND > car='bar') > > - > > (SELECT od_reading FROM mileage WHERE date='2018/05/06' AND car='bar') > > As ExactMileage > > > > You can rephrase that as: > > SELECT end.od_reading - start.od_reading FROM mileage AS start, mileage > AS end WHERE end.date='2018/05/20' AND start.date='2018/05/06' AND end.car > ='bar' and start.car='bar' > > > > Or even you could use CTEs to repeat yourself less: > > WITH OnlyBar AS SELECT * FROM mileage WHERE car='bar' > > SELECT end.od_reading - start.od_reading FROM OnlyBar AS start, OnlyBar > AS end WHERE end.date='2018/05/20' AND start.date='2018/05/06 > > > > If you might query between two dates that don't necessarily have a > record, the best you can do is give a range of what the possible driven > distance may be: > > SELECT > > (SELECT MIN(od_reading) FROM mileage WHERE date >= '2018/05/20' AND > car='bar') > > - > > (SELECT MAX(od_reading) FROM mileage WHERE date <= '2018/05/06' AND > car='bar') > > AS MaxPossible, > > (SELECT MAX(od_reading) FROM mileage WHERE date <= '2018/05/20' AND > car='bar') > > - > > (SELECT MIN(od_reading) FROM mileage WHERE date >= '2018/05/06' AND > car='bar') > > AS MinPossible > > > > The second query finds the records before and after the dates in > question (or uses data on exactly that date) to figure out the minimum and > maximum possible distances that may have been driven between the dates of > interest. > > > > Note that there is a more efficient form of the second query, where one > selects just od_reading and orders by date, with a limit of 1 instead of > using the MIN and MAX functions; if your table is going to be large then > that is a better option (with an index on (car, date), the value can then > be computed with an index seek instead of a table scan). I used the min/max > version because it's simpler and easier to read > > > > Thanks all for for the helpful replies! > > All of them work, as expected, but I see I wasn't exactly clear with my > second > part of the question. > > Is it possible to determine how many miles were driven the previous week > with > current week's data in one query. > > For example with foo: > 2018/05/20 - 2018/05/09 = 126 > 2018/05/09 - 2018/04/29 = 172 > 2018/04/29 - 2018/04/22 = 185 > > Basically some kind of for loop through all the matches of 'foo' > > > > > > > Thanks, > > > j.b. > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users