创建一个SQLite视图,其中一行取决于前一行

我想在SQLite中创建一个视图,其中一行中的字段取决于前一行中的字段的值。 我可以使用LAG分析函数在Oracle中执行此操作,但不确定如何在SQLite中执行此操作。

例如,如果我的桌子看起来像这样:

ITEM        DAY           PRICE
apple       2011-01-07    1.25
orange      2011-01-02    1.00
apple       2011-01-01    1.00
orange      2011-01-03    2.00
apple       2011-01-08    1.00
apple       2011-01-10    1.50

我希望我的视图看起来像WHERE item = 'apple'

DAY           PRICE    CHANGE
2011-01-01    1.00     (null)
2011-01-07    1.25     0.25
2011-01-08    2.00     0.75
2011-01-10    1.50     -0.50

编辑:

相当于我在寻找的查询会在Oracle看起来像(没有尝试过,但我认为这是正确的):

SELECT day, price, 
       price - LAG( price, 1 ) OVER ( ORDER BY day ) AS change
  FROM mytable
 WHERE item = 'apple'

它与其他的相同,但只是使用字段而不是rowid。 这正是你想要的:


CREATE TABLE Prices (
    day DATE,
    price FLOAT
);

INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '+1 day'), 0.5);
INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '+0 day'), 1);
INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '-1 day'), 2);
INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '-2 day'), 7);
INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '-3 day'), 8);
INSERT INTO Prices(day, price) VALUES(date('now', 'localtime', '-4 day'), 10);

SELECT p1.day, p1.price, p1.price-p2.price 
FROM
    Prices p1, Prices p2,
    (SELECT t2.day AS day1, MAX(t1.day) AS day2 
    FROM Prices t1, Prices t2
    WHERE t1.day < t2.day
    GROUP BY t2.day) AS prev
WHERE p1.day=prev.day1
    AND p2.day=prev.day2

如果你想添加WHERE item='apple'位,你可以将它添加到两个WHERE子句中。


这应该为每个item (在SQLite上测试):

SELECT 
    day
    ,price
    ,price - (SELECT t2.price 
              FROM mytable t2 
              WHERE 
                  t2.item = t1.item AND 
                  t2.day < t1.day      
              ORDER BY t2.day DESC
              LIMIT 1
             ) AS change
FROM mytable t1

这假定dayitem之间的组合是唯一的。 它的工作方式是将所有值都小于给定day ,按降序排序,然后LIMIT第一个值,模拟LAG函数。

对于LEAD行为,只需将< to >DESCASC


假设你不删除这将工作:


SELECT t2.DAY, t2.price, t2.price-t1.price 
FROM TABLENAME t1, TABLENAME t2 
WHERE t1.rowid=t2.rowid-1

这是可行的,因为即使你不在CREATE语句中指定它,每一行都有自己的rowid。

如果你删除,它会变成:


SELECT t2.day, t2.price, t2.price-t1.price 
FROM 
     (SELECT l1.day, l1.price, 
          (SELECT COUNT(*) 
          FROM TABLENAME l2 
          WHERE l2.rowid < l1.rowid) AS count
      FROM TABLENAME l1) AS t1,
     (SELECT l1.day, l1.price, 
          (SELECT COUNT(*) 
          FROM TABLENAME l2 
          WHERE l2.rowid < l1.rowid) AS count
      FROM TABLENAME l1) AS t2
WHERE t1.count=t2.count-1

这是在rowid始终在增加的假设下工作的。

链接地址: http://www.djcxy.com/p/10641.html

上一篇: Create a SQLite view where a row depends on the previous row

下一篇: Fixed topbar vs named anchors