Почему SQLite LEAD всегда возвращает NULL? - PullRequest
0 голосов
/ 01 марта 2019

Я бегу:

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

Я пытаюсь найтиследующее sort значение после строки 2 sort, но я всегда получаю значение по умолчанию, но ожидаю получить 4.0:

sqlite> select lead(sort, 1, -42) over (order by sort) as next_sort 
        from foo 
        where id = 2;
next_sort
-42

1 Ответ

0 голосов
/ 01 марта 2019

Внимание: Функции окна SQLite доступны только в версии 3.25.0 и более поздних , а если вы используете SQLite с Android, даже Android API 28 имеет только SQLite 3.22.0 и старшеВерсии Android имеют даже более старые SQLites .

Функции окна SQLite работают с результирующим набором, а не с таблицей.Таким образом, моей проблемой было мое предложение 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
...