Я хочу добавить сумму для бегущего значения в столбце, но если последовательность не удалась, нам не нужно добавлять - PullRequest
0 голосов
/ 13 марта 2020

У меня есть такая таблица

+----+--------+------+------+
| id | state  | num  | pop  |
+----+--------+------+------+
|  1 | ny     |    1 |  100 |
|  1 | ny     |    2 |  200 |
|  1 | ny     |    3 |  600 |
|  1 | ny     |    6 |  400 |
|  1 | ny     |    7 |  300 |
|  1 | ny     |   14 | 1000 |
|  2 | nj     |    3 |  250 |
+----+--------+------+------+

Я хочу вывод, как показано ниже

+---+----+----+------+------+
| 1 | ny |  1 |  100 |  900 |
| 1 | ny |  2 |  200 |  900 |
| 1 | ny |  3 |  600 |  900 |
| 1 | ny |  6 |  400 |  700 |
| 1 | ny |  7 |  300 |  700 |
| 1 | ny | 14 | 1000 | 1000 |
| 2 | nj |  3 |  250 |  250 |
+---+----+----+------+------+

Так что если в столбце num есть последовательность, то мы должны добавить столбец pop. Итак, первые 3 столбца num столбца имеют 1,2,3, который находится в последовательности, поэтому мы добавляем всплывающий столбец 100 + 200 + 600 и отображаем как новый столбец.

Я пробовал код ниже, но я не получаю желаемый выход положить

select id, state,num, pop,
sum(pop) over (partition by id, state order by num )
from table

1 Ответ

0 голосов
/ 13 марта 2020

Если вычесть последовательность, значения будут постоянными для значений в строке. Затем вы можете использовать оконные функции:

select t.*,
       sum(pop) over (partition by state, num - seqnum) as new_population
from (select t.*,
             row_number() over (partition by state order by num) as seqnum
      from t
     ) t;

Здесь - это скрипта db <> (используется Postgres).

...