为什么SQLite LEAD总是返回空值?
我在跑步:为什么SQLite LEAD总是返回空值?,sqlite,window-functions,Sqlite,Window Functions,我在跑步: sqlite> .version SQLite 3.27.1 2019-02-08 13:17:39 0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd zlib version 1.2.11 clang-10.0.0 我有下表: CREATE TABLE FOO ( ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, SORT REAL NOT
sqlite> .version
SQLite 3.27.1 2019-02-08 13:17:39 0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd
zlib version 1.2.11
clang-10.0.0
我有下表:
CREATE TABLE FOO (
ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
SORT REAL NOT NULL UNIQUE DEFAULT 0,
NAME TEXT NOT NULL
);
CREATE TRIGGER FOO_sort_after_insert_trigger
AFTER INSERT ON FOO FOR EACH ROW
BEGIN
UPDATE FOO
SET SORT = (
SELECT IFNULL(MAX(SORT), 0) + 1
FROM FOO
)
WHERE ID = NEW.ID;
END;
因此:
sqlite> select * from foo order by sort;
ID|SORT|NAME
1|1.0|A
2|3.5|B
4|4.0|D
3|5.0|C
我试图在第2行sort
之后找到下一个sort
值,但我总是得到默认值,但我希望得到4.0
:
sqlite> select lead(sort, 1, -42) over (order by sort) as next_sort
from foo
where id = 2;
next_sort
-42
注意:如果您将SQLite与Android一起使用,则即使是Android API 28
也只有SQLite 3.22.0
,以及
操作结果集,而不是表格。因此,我的问题是我的where id=2
子句。这将结果集限制为1行,因此LEAD
始终返回默认值。为了实现我的目标,我必须在结果集中包含足够的结果,以便窗口函数能够访问下一行:
sqlite> select next_sort
from ( select id,
lead(sort, 1, -42)
over (order by sort) as next_sort
from foo
) where id = 2;
next_sort
4.0
“窗口功能在结果集上运行”。。。这并不完全准确。您面临的问题是,其中
发生在对分析函数求值之前。因此,id=2
记录将在LEAD
计算之前抛出。在应用之前先在子查询中具体化分析函数,其中是处理此问题的标准方法。在应用之前先在子查询中具体化分析函数,其中是处理此问题的标准方法,这不是我所做的吗?是的,这就是您所做的,这也是为什么我对你的答案投了赞成票:-)。。。我只是在纠正你使用的一些语言,仅此而已,我很感激。我正在努力理解其中的区别。在LEAD评估之前抛出id=2记录的意味着什么?WHERE
case不是全部id!=2
要丢弃的记录?是的,但在您的回答中,丢弃记录是在计算潜在客户之后发生的。所以,这可能会有所不同。