我无法根据“ 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()
命令相比时。
答案 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_;