在Oracle中半转置表格

时间:2019-03-29 16:30:39

标签: sql oracle transpose

我无法根据“ LENGTH”列半移下表。我正在使用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语句的解决方案,但是它们似乎过于复杂,尤其是与Posgres的简单generate_series()命令相比时。

1 个答案:

答案 0 :(得分:0)

1减去length直到达到1的递归CTE应该可以工作。 (顺便说一句,顺便说一句,在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