PostgresQL для каждой строки, создать новые строки и объединить - PullRequest
0 голосов
/ 06 мая 2020

У меня есть таблица с именем example , которая выглядит следующим образом:

ID | MIN | MAX |
1  | 1   |  5  |
2  | 34  | 38  |

Мне нужно взять каждый идентификатор и l oop от минимального до максимального, увеличивая на 2 и таким образом, получите следующие БЕЗ с использованием операторов INSERT, таким образом, в SELECT:

ID | INDEX | VALUE
1  |  1    |   1
1  |  2    |   3
1  |  3    |   5
2  |  1    |   34
2  |  2    |   36
2  |  3    |   38

Есть идеи, как это сделать?

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Функция , возвращающая набор generate_series, делает именно это:

SELECT
  id,
  generate_series(1, (max-min)/2+1) AS index,
  generate_series(min, max, 2) AS value
FROM
  example;

( онлайн-демонстрация )

В качестве альтернативы индекс можно создать с помощью RANK() ( пример , см. Также ответ @ a_horse_with_no_name), если вы не хотите полагаться на параллельные наборы.

2 голосов
/ 06 мая 2020

Используйте generate_series() для генерации чисел и оконную функцию для вычисления индекса:

select e.id, 
       row_number() over (partition by e.id order by g.value) as index,
       g.value
from example e
  cross join generate_series(e.min, e.max, 2) as g(value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...