Полу-транспонирование таблицы в Oracle - PullRequest
0 голосов
/ 29 марта 2019

У меня возникли проблемы с полу-транспонированием приведенной ниже таблицы на основе столбца «ДЛИНА».Я использую базу данных Oracle, примеры данных:

+-----------+-----------+--------+------+
| PERSON_ID | PERIOD_ID | LENGTH | FLAG |
+-----------+-----------+--------+------+
|         1 |         1 |      4 |    1 |
|         1 |         2 |      3 |    0 |
|         2 |         1 |      4 |    1 |
+-----------+-----------+--------+------+

Я хотел бы удлинить эту таблицу на основе строки LENGTH;в основном дублирует строку для каждого значения в столбце LENGTH.

См. желаемую выходную таблицу ниже:

+-----------+-----------+--------+------+
| PERSON_ID | PERIOD_ID | NUMBER | FLAG |
+-----------+-----------+--------+------+
|         1 |         1 |      1 |    1 |
|         1 |         1 |      2 |    1 |
|         1 |         1 |      3 |    1 |
|         1 |         1 |      4 |    1 |
|         1 |         2 |      1 |    0 |
|         1 |         2 |      2 |    0 |
|         1 |         2 |      3 |    0 |
|         2 |         1 |      1 |    1 |
|         2 |         1 |      2 |    1 |
|         2 |         1 |      3 |    1 |
|         2 |         1 |      4 |    1 |
+-----------+-----------+--------+------+

Обычно я работаю в Posgres, поэтому Oracle является для меня новым.

Я нашел некоторые решения, использующие оператор connect by, но они кажутся слишком сложными, особенно по сравнению с простой командой generate_series() от Posgres.

1 Ответ

0 голосов
/ 29 марта 2019

Рекурсивное CTE, вычитающее 1 из length до достижения 1, должно работать.(Кстати, в Postgres, если вам нужно что-то работающее кроссплатформенное.)

WITH cte (person_id,
          period_id,
          number_,
          flag)
AS
(
SELECT person_id,
       period_id,
       length number_,
       flag
       FROM elbat
UNION ALL
SELECT person_id,
       period_id,
       number_ - 1 number_,
       flag
       FROM cte
       WHERE number_ > 1
)
SELECT *
       FROM cte
       ORDER BY person_id,
                period_id,
                number_;

db <> fiddle

...