7

我有一个SQLite表,其中包含各种产品的价格。这是一个快照表,因此它包含 5 分钟间隔的价格。我想编写一个查询,返回每个项目从一行到下一行的价格差异。

列是 id(汽车公司)、record_id(产品的 id)、价格(当时的价格)、时间(距纪元仅几秒)

我正在尝试返回一个“差异”列,其中包含间隔之间的差异值。

鉴于以下

id record_id 价格时间
1 苹果001 36.00 ...
67 苹果001 37.87 ...
765 苹果001 45.82 ...
892 苹果001 26.76 ...

我希望它返回
id record_id 价格时差
1 苹果001 36.00 ... 0
67 苹果001 37.87 ... 1.87
765 苹果001 45.82 ... 7.95
892 苹果001 26.76 ... -19.06

SQLite可以吗?

其次,是否有可能 - 有没有办法将其限制为最后 5 条左右的记录?

我会很感激任何帮助,谢谢。


只是想补充一些东西。我在其他数据库中找到了这样做的方法,但我使用的是 XULRunner,因此使用的是 SQLite。这就是我改用它的原因。

第二个问题可能需要澄清,我希望按时间订购并分析最后 5 条记录。如果需要,我可以单独解决这个问题。

这是一个 MySQL解决方案。这是我正在走向的方法,但交易破坏者是“如果表包含序列列但存在间隙,请重新编号。如果表不包含这样的列,请添加一个”。根据设计,这种情况存在差距,因为一次更新了许多记录并且不会按顺序进行。

4

2 回答 2

9

我不知道 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 

我希望其中一位能帮助你。

于 2008-10-25T11:58:20.450 回答
8

是的,有点晚了,但为了完整性。2018 年的 SQLite Release 3.25.0 增加了对窗口函数的支持。现在可以使用LAG() 和 LEAD()函数完成上述任务。

取自:https ://www.sqlitetutorial.net/sqlite-window-functions/

LAG 提供对位于当前行之前的给定物理偏移量的行的访问。

因此,在 Linux 中使用 sqlite3 命令,以下内容应与您的问题中列出的输出相匹配。前 2 个命令仅用于显示正确的输出格式。

sqlite> .mode columns
sqlite> .headers on
sqlite> CREATE TABLE data(id INT, record_id TEXT, price REAL);
sqlite> INSERT INTO data VALUES(1,"apple001",36.00);
sqlite> INSERT INTO data VALUES(67,"apple001",37.87);
sqlite> INSERT INTO data VALUES(765,"apple001",45.82);
sqlite> INSERT INTO data VALUES(892,"apple001",26.76);
sqlite> SELECT id, record_id, price, (price - LAG(price, 1) OVER (ORDER BY id)) AS difference FROM data;
id          record_id   price       difference
----------  ----------  ----------  ----------
1           apple001    36.0                  
67          apple001    37.87       1.87      
765         apple001    45.82       7.95      
892         apple001    26.76       -19.06

我希望这将为新用户节省一些时间。

于 2020-04-03T21:24:45.697 回答