Как рассчитать текущую сумму на запрос SQLite? - PullRequest
9 голосов
/ 09 апреля 2011

Как получить столбец, который является суммой всех значений перед другим столбцом?

Ответы [ 3 ]

11 голосов
/ 09 апреля 2011

Вы можете сделать это, соединив таблицу с самим собой (выполнив так называемое декартово или перекрестное соединение ). Смотрите следующий пример.

SELECT a.name, a.gdppc, SUM(b.gdppc)
FROM gdppc AS a, gdppc AS b WHERE b.gdppc <= a.gdppc 
GROUP BY b.id ORDER BY a.gdppc;

С учетом таблицы, содержащей страны и их ВВП на душу населения, вы получите промежуточную сумму показателя ВВП.

Democratic Republic of Congo|329.645|329.645
Zimbabwe|370.465|700.11
Liberia|385.417|1085.527
Burundi|399.657|1485.184
Eritrea|678.954|2164.138
Niger|711.877|2876.015
Central African Republic|743.945|3619.96
Sierra Leone|781.594|4401.554
Togo|833.803|5235.357
Malawi|867.063|6102.42
Mozambique|932.511|7034.931
...

Обратите внимание, что это может быть очень ресурсоемкой операцией, потому что, если таблица имеет N элементов, она создаст временную таблицу с N * N элементами. Я бы не стал делать это на большом столе.

3 голосов
/ 08 декабря 2017

Решения с перекрестным соединением, такие как 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), вероятно, не существует, не полагаясь на внешнее приложение.

0 голосов
/ 09 апреля 2011

Вы должны сделать сумму в нужном вам поле .... Запрос зависит от базы данных, которую вы используете, Oracle позволяет вам сделать это:

select id, value, sum(value) as partial_sum over (order by id) from table
...