Решения с перекрестным соединением, такие как Diomidis Spinellis , предлагают принять O (N ^ 2) время.Рекурсивный CTE может работать быстрее, если вы можете справиться с запутанным кодом.
Это выдает тот же вывод, что и его.
WITH RECURSIVE running(id, name, gdppc, rt) AS (
SELECT row1._rowid_, row1.name, row1.gdppc, COALESCE(row1.gdppc,0)
FROM gdppc AS row1
WHERE row1._rowid_ = (
SELECT a._rowid_
FROM gdppc AS a
ORDER BY a.gdppc, a.name, a._rowid_
LIMIT 1)
UNION ALL
SELECT row_n._rowid_, row_n.name, row_n.gdppc, COALESCE(row_n.gdppc,0)+running.rt
FROM gdppc AS row_n INNER JOIN running
ON row_n._rowid_ = (
SELECT a._rowid_
FROM gdppc AS a
WHERE (a.gdppc, a.name, a._rowid_) > (running.gdppc, running.name, running.id)
ORDER BY a.gdppc, a.name, a._rowid_
LIMIT 1))
SELECT running.name, running.gdppc, running.rt
FROM running;
Упорядочение и сравнение учитывают дубликаты, COALESCE
там игнорировать NULL.
Если у вас хороший индекс, это должно быть O (N log N).Поскольку SQLite не поддерживает курсоры, решение O (N), вероятно, не существует, не полагаясь на внешнее приложение.