为什么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
要丢弃的记录?是的,但在您的回答中,丢弃记录是在计算潜在客户之后发生的。所以,这可能会有所不同。