创建一个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
这假定day
和item
之间的组合是唯一的。 它的工作方式是将所有值都小于给定day
,按降序排序,然后LIMIT
第一个值,模拟LAG
函数。
对于LEAD
行为,只需将<
to >
和DESC
为ASC
。
假设你不删除这将工作:
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