从 Teradata 中的范围创建行级数据
Create Row level data from a range in Teradata
我有一个 table 如下所示
EMP_NUM
START_RNG
END_RNG
123
H1
H3
456
H4
H6
我需要它看起来像下面的那个。
EMP_NUM
ID
123
H1
123
H2
123
H3
456
H4
456
H5
456
H6
我在之前的 post 中就日期提出了类似的问题,但我认为 EXPAND ON
不会起作用,因为它适用于时间段。有没有办法在 Teradata 中解决这个问题。我也是递归的新手。尝试了以下逻辑,但在 Teradata 中出现错误。不确定是否存在替代语法。
WITH temp AS
(
SELECT 1 AS ID
UNION ALL
SELECT t.ID + 1 FROM temp t
WHERE t.ID < 100000
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
OPTION (MAXRECURSION 0);
不确定这是最佳答案,但至少它在语法上是正确的。
WITH RECURSIVE temp AS
(
SELECT * from (SELECT 1 AS ID) z
UNION ALL
SELECT t.ID + 1 FROM temp t
WHERE t.ID < 100
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
;
可以通过人为转换到 date/time 范围并返回来使用 EXPAND ON,例如
SELECT begin(PD)-date'1900-01-01' as ID, EMP_NUM
FROM Table1
EXPAND ON PERIOD(date'1900-01-01'+START_RNG,date'1900-01-01'+END_RNG+1) as PD;
我有一个 table 如下所示
EMP_NUM | START_RNG | END_RNG |
---|---|---|
123 | H1 | H3 |
456 | H4 | H6 |
我需要它看起来像下面的那个。
EMP_NUM | ID |
---|---|
123 | H1 |
123 | H2 |
123 | H3 |
456 | H4 |
456 | H5 |
456 | H6 |
我在之前的 post 中就日期提出了类似的问题,但我认为 EXPAND ON
不会起作用,因为它适用于时间段。有没有办法在 Teradata 中解决这个问题。我也是递归的新手。尝试了以下逻辑,但在 Teradata 中出现错误。不确定是否存在替代语法。
WITH temp AS
(
SELECT 1 AS ID
UNION ALL
SELECT t.ID + 1 FROM temp t
WHERE t.ID < 100000
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
OPTION (MAXRECURSION 0);
不确定这是最佳答案,但至少它在语法上是正确的。
WITH RECURSIVE temp AS
(
SELECT * from (SELECT 1 AS ID) z
UNION ALL
SELECT t.ID + 1 FROM temp t
WHERE t.ID < 100
) -- return table with id from 1 to 100000
SELECT t.ID, y.EMP_NUM
FROM Table1 y
INNER JOIN temp t ON t.ID BETWEEN y.START_RNG AND y.END_RNG
;
可以通过人为转换到 date/time 范围并返回来使用 EXPAND ON,例如
SELECT begin(PD)-date'1900-01-01' as ID, EMP_NUM
FROM Table1
EXPAND ON PERIOD(date'1900-01-01'+START_RNG,date'1900-01-01'+END_RNG+1) as PD;