0

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

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

4

2 回答 2

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

这可能会快一点,因为它不需要多次设置对表的读取。

于 2013-02-22T15:16:23.810 回答
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
于 2013-02-22T15:19:23.517 回答