以递归方式递增sql中的日期

时间:2013-02-22 15:03:52

标签: sql loops data-warehouse teradata

我正在进行数据的历史转换,并想知道是否有更有效的方法来完成日期增量。

我在星期六(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脚本中运行。

2 个答案:

答案 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