【问题标题】:SQL Insert Set of Values Optimized优化的 SQL 插入值集
【发布时间】:2022-01-13 09:46:29
【问题描述】:

目标是在 Teradata 中创建一个包含一年样本数据的表。一种方法是复制类似数据的前 6 个条目,然后将时间戳更改 365 次(对于我的用例)。 不懂就写个程序

REPLACE PROCEDURE stackoverflow()
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 部门不希望我们使用程序。有没有更好的方法可以在没有程序的情况下达到相同的结果?

【问题讨论】:

    标签: sql set teradata procedure


    【解决方案1】:

    获取重复数据的通用方法是 CROSS JOIN:

    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
    

    【讨论】:

    • 非常好的答案。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 2011-05-06
    • 2014-03-21
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 2016-05-06
    相关资源
    最近更新 更多