Нахождение разницы в строках в запросе с использованием SQLite - PullRequest
6 голосов
/ 25 октября 2008

У меня есть таблица SQLite , которая содержит цены на различные продукты. Это таблица снимков, поэтому она содержит цены с 5-минутными интервалами. Я хотел бы написать запрос, который бы возвращал разницу в цене от одной строки к следующей для каждого элемента.

Столбцы: id (auto inc), record_id (id продукта), цена (цена в тот момент времени), время (в секундах с начала эпохи)

Я пытаюсь вернуть столбец «разница», который содержит значение разницы между интервалами.

Given the following

id      record_id       price   time
1       apple001        36.00   ...
67      apple001        37.87   ...
765     apple001        45.82   ...
892     apple001        26.76   ...

I'd like it to return
id      record_id       price   time    difference
1       apple001        36.00   ...     0
67      apple001        37.87   ...     1.87
765     apple001        45.82   ...     7.95
892     apple001        26.76   ...     -19.06

Возможно ли это с SQLite?

Во-вторых, должно ли это быть возможным - есть ли способ ограничить его последними 5 или около того записями?

Буду признателен за любую помощь, спасибо.


Просто хотел добавить несколько вещей. Я нашел способы сделать это в других базах данных, но я использую XULRunner, то есть SQLite. Вот почему я работаю с этим вместо этого.

Дополнительный вопрос, возможно, нуждается в уточнении, я ищу порядок по времени, беру и анализирую последние 5 записей. Это проблема, которую я могу решить отдельно, если это будет необходимо.

Вот решение MySQL , вроде. Это тот подход, к которому я стремлюсь, но прерыватель сделки: «Если в таблице есть столбец последовательности, но есть пробелы, перенумеруйте его. Если в таблице нет такого столбца, добавьте один». По своему замыслу в этом сценарии есть пробелы, поскольку одновременно обновляется много записей, и они не будут в порядке.

1 Ответ

8 голосов
/ 25 октября 2008

Я не знаю, есть ли какие-то ограничения в SQLite, но вы можете попробовать следующие операторы, которые работают в Sql Server.

Если разница во времени постоянна (вы утверждаете, что она составляет 5 минут), вы можете написать:

SELECT A.id, A.record_id, A.price, A.time, ISNULL(A.price - B.price, 0) AS difference
FROM Table1 as A 
    LEFT OUTER JOIN Table1 B ON A.record_id = B.record_id AND A.time - B.time = 5

в противном случае

SELECT A.id, A.record_id, A.price, A.time, ISNULL(A.price - B.price, 0) AS difference
FROM Table1 as A 
    LEFT OUTER JOIN Table1 B ON B.record_id = A.record_id 
         AND B.time = (SELECT MAX(time) FROM Table1 C WHERE C.time < A.time AND C.record_id = A.record_id)

Выражение без объединений выглядит следующим образом

SELECT id, record_id, price, time,
    (SELECT A.price - B.price
        FROM Table1 as B
        WHERE B.record_id = A.record_id AND
            B.time = (SELECT MAX(time) FROM Table1 C WHERE C.time < A.time AND C.record_id = A.record_id)) AS difference
FROM Table1 as A 

Я надеюсь, что один из них поможет вам.

...