SQL для сгенерированной таблицы со столбцом 1 последовательности чисел и столбцом 2 текущей суммы - PullRequest
0 голосов
/ 29 апреля 2019

Каким будет SQL (стандартный или любой другой основной вариант) для создания таблицы, подобной следующей?

1   1   -- 1
2   3   -- 2+1
3   6   -- 3+2+1
4   10  -- 4+3+2+1
5   15  -- 5+4+3+2+1
6   21  -- 6+5+4+3+2+1

... ...

Второй столбец - это сумма чисел в первом.

Я не мог пройти через это:

select rownum from all_objects  where rownum <= 10;

, который производит столбец 1 (PL / SQL)

Пытался подумать о следующих строках, но ясно, что это неправильно, даже синтаксически:

select rownum, count(t2.rownum)
 from 
 (select sum(rownum) from all_objects  where rownum <= 10) t2,
 all_objects  
 where rownum <= 10;

Ответы [ 3 ]

1 голос
/ 29 апреля 2019

Это просто математика :

select rownum, rownum * (rownum + 1) / 2
from all_objects
where rownum <= 10;
1 голос
/ 29 апреля 2019

Вам не нужно нажимать на all_objects представление;Вы можете использовать иерархический запрос:

select level as position, sum(level) over (order by level) as running_sum
from dual
connect by level <= 10;

  POSITION RUNNING_SUM
---------- -----------
         1           1
         2           3
         3           6
         4          10
         5          15
         6          21
         7          28
         8          36
         9          45
        10          55

или использовать метод арифметических рядов @forpas:

select level as position, level * (level + 1) / 2  as running_sum
from dual
connect by level <= 10;

  POSITION RUNNING_SUM
---------- -----------
         1           1
         2           3
         3           6
         4          10
         5          15
         6          21
         7          28
         8          36
         9          45
        10          55

Или рекурсивный факторинг подзапросов (11gR2 +):

with rcte (position, running_sum) as (
  select 1, 1 from dual
  union all
  select position + 1, running_sum + position + 1
  from rcte
  where position < 10
)
select * from rcte
order by position;

  POSITION RUNNING_SUM
---------- -----------
         1           1
         2           3
         3           6
         4          10
         5          15
         6          21
         7          28
         8          36
         9          45
        10          55
0 голосов
/ 29 апреля 2019

Вы ищете совокупную сумму:

select rownum, sum(rownum) over (order by rownum)
from all_objects
where rownum <= 10;

Я не был уверен, что это действительно будет работать на rownum, но делает .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...