我正在进行数据的历史转换,并想知道是否有更有效的方法来完成日期增量。
我在星期六(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
)
我只是问,因为通过这个sql脚本看起来将接近5亿条记录。重要的是它将在TERADATA的BTEQ脚本中运行。
答案 0 :(得分:2)
首先,使用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
这可能会快一些,因为它不需要多次设置对表的读取。
答案 1 :(得分:1)
一种选择是使用递归查询,但我认为它不会更快 - 只是更容易阅读:
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 recursiveCTE