【问题标题】:Finding the difference in rows in query using SQLite使用 SQLite 查找查询中的行差异
【发布时间】:2010-09-19 04:07:07
【问题描述】:

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

【问题讨论】:

    标签: sql sqlite limit xulrunner


    【解决方案1】:

    是的,有点晚了,但为了完整起见。 2018 年的 SQLite Release 3.25.0 增加了对窗口函数的支持。现在可以使用LAG() and 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
    

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

    【讨论】:

    • 有点晚了,但还是帮了我!谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • 有连接好还是没有连接好,为什么?
    猜你喜欢
    • 2021-12-27
    • 2022-10-13
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2011-05-11
    • 2022-12-19
    相关资源
    最近更新 更多