使用SQLite查找查询中行的差异

6 sql sqlite xulrunner limit

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

列是id(自动公司),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 解决方案,有点像.这是我正朝着的方向,但交易破坏者是"如果表格包含一个序列列,但有间隙,重新编号.如果表格中没有这样的列,请添加一个".根据设计,这种情况存在差距,因为有许多记录一次更新而且不会按顺序更新.

Pan*_*nos 8

我不知道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
Run Code Online (Sandbox Code Playgroud)

除此以外

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)
Run Code Online (Sandbox Code Playgroud)

没有连接的语句如下

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 
Run Code Online (Sandbox Code Playgroud)

我希望他们中的一个会帮助你.

  • 有连接更好还是没有连接更好,为什么? (2认同)

小智 6

是的,这有点晚了,但为了完整性。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
Run Code Online (Sandbox Code Playgroud)

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