我正在处理数据的历史转换,我想知道是否有更有效的方法来完成日期递增。
我在周六(1-7-13)从源系统接收数据,并希望推送该数据,使其填满前一周的所有日期(1-6-13,1-5-13等)。
所以现在我正在做几个联合
insert into target
(date, name)
select date,name
from
(
SELECT date as date, name FROM SOURCE
UNION
SELECT date - 1 as date, name FROM SOURCE
UNION
SELECT date -2 as date, name FROM SOURCE
)我之所以这样问,是因为看起来有近5亿条记录将通过此sql脚本进行处理。如果有关系,它将在TERADATA中的BTEQ脚本中运行。
发布于 2013-02-22 23:16:24
首先,使用union all比使用union更快。union删除重复项,在这种情况下似乎不需要。如果您确实需要删除它们,则在源代码级别执行此操作:
from (select distinct name from source)而不是使用union隐式完成。
您还可以尝试交叉连接方法:
select date - i, name
from source cross join
(select 0 as i union all select 1 union all select 2 union all select 3 union all
select 4 union all select 5 union all select 6
) const这可能会快一点,因为它不需要多次设置对表的读取。
发布于 2013-02-22 23:19:24
一种选择是使用递归查询,但我不认为它会更快--只是可能更容易阅读:
WITH RECURSIVE recursiveCTE (date, name) AS (
SELECT date, name
FROM Source
UNION ALL
SELECT r.date-1, r.name
FROM recursiveCTE R
JOIN Source T ON R.name = T.name AND T.date < r.date+6
)
INSERT INTO Target (date,name)
SELECT date,name From recursiveCTEhttps://stackoverflow.com/questions/15027058
复制相似问题