【问题标题】:Why does SQLite LEAD always return NULL?为什么 SQLite LEAD 总是返回 NULL?
【发布时间】:2019-07-23 02:30:03
【问题描述】:

我在跑步:

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

我试图在2sort 行之后找到下一个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 window-functions


    【解决方案1】:

    注意:SQLite window functions are only available in version 3.25.0 and later,如果您在 Android 上使用 SQLite,即使 Android API 28 也只有 SQLite 3.22.0older Android versions have even older SQLites

    SQLite window functions 对结果集进行操作,而不是对表进行操作。因此,我的问题是我的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
    

    【讨论】:

    • “窗口函数对结果集进行操作”……这并不完全准确。您面临的问题是WHERE 发生在分析函数被评估之前。所以id = 2 记录将在LEAD 评估之前被丢弃。在应用WHERE 之前,首先在子查询中具体化分析函数是处理此问题的标准方法。
    • Materializing the analytic function first in a subquery before applying WHERE is a standard way to deal with this problem 这不是我做的吗?
    • 是的,这就是你所做的,这也是我支持你的答案的原因:-) ...我只是在纠正你使用的一些语言,仅此而已 ^ ^
    • 我很感激。我试图理解其中的区别。 So the id = 2 records would be thrown out before LEAD evaluates 是什么意思? WHERE 不是将所有id != 2 记录都扔掉吗?
    • 是的,但是在您的回答中,记录的丢弃发生在已经计算出潜在客户之后。所以,这可能会有所作为。
    猜你喜欢
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    • 2015-02-27
    • 2021-01-10
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多