SQL 插入一组优化值
SQL Insert Set of Values Optimized
目标是用 Teradata 中的样本数据创建一个 table 一年。一种方法是复制相似数据的前 6 个条目,然后将时间戳更改 365 次(对于我的用例)。
我不知道更好,写了一个程序
REPLACE PROCEDURE Whosebug()
BEGIN
DECLARE i INTEGER DEFAULT 0;
DELETE FROM TestTable;
WHILE i < 365 DO
INSERT INTO TestTable
SELECT
TestName
,Name_DT + i
FROM
(SELECT TOP 6
*
FROM TestTable2
WHERE Name_DT = '2021-12-15') AS sampledata;
SET i = i + 1;
END WHILE;
END;
这有效,但速度非常慢。 IT 部门也不希望我们使用程序。有没有更好的方法不用手术也能达到同样的效果?
获取重复数据的通用方法是交叉连接:
SELECT
TestName
,calendar_date
FROM
( SELECT TOP 6 *
FROM TestTable2
WHERE Name_DT = DATE '2015-12-15'
) AS sampledata
CROSS JOIN
( SELECT calendar_date
FROM sys_calendar.CALENDAR
WHERE calendar_date BETWEEN DATE '2011-12-15'
AND DATE '2011-12-15' + 364
) AS cal
;
在您的情况下,有 Teradata 的专有 EXPAND ON 语法来创建时间序列:
SELECT TestName, Begin(pd)
FROM
( SELECT TOP 6 *
FROM TestTable2
WHERE Name_DT = DATE '2015-12-15'
) AS sampledata
-- create one row per day in the range
EXPAND ON PERIOD(Name_DT, Name_DT +365) AS pd
目标是用 Teradata 中的样本数据创建一个 table 一年。一种方法是复制相似数据的前 6 个条目,然后将时间戳更改 365 次(对于我的用例)。 我不知道更好,写了一个程序
REPLACE PROCEDURE Whosebug()
BEGIN
DECLARE i INTEGER DEFAULT 0;
DELETE FROM TestTable;
WHILE i < 365 DO
INSERT INTO TestTable
SELECT
TestName
,Name_DT + i
FROM
(SELECT TOP 6
*
FROM TestTable2
WHERE Name_DT = '2021-12-15') AS sampledata;
SET i = i + 1;
END WHILE;
END;
这有效,但速度非常慢。 IT 部门也不希望我们使用程序。有没有更好的方法不用手术也能达到同样的效果?
获取重复数据的通用方法是交叉连接:
SELECT
TestName
,calendar_date
FROM
( SELECT TOP 6 *
FROM TestTable2
WHERE Name_DT = DATE '2015-12-15'
) AS sampledata
CROSS JOIN
( SELECT calendar_date
FROM sys_calendar.CALENDAR
WHERE calendar_date BETWEEN DATE '2011-12-15'
AND DATE '2011-12-15' + 364
) AS cal
;
在您的情况下,有 Teradata 的专有 EXPAND ON 语法来创建时间序列:
SELECT TestName, Begin(pd)
FROM
( SELECT TOP 6 *
FROM TestTable2
WHERE Name_DT = DATE '2015-12-15'
) AS sampledata
-- create one row per day in the range
EXPAND ON PERIOD(Name_DT, Name_DT +365) AS pd