首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归递归递增sql中的日期

递归递归递增sql中的日期
EN

Stack Overflow用户
提问于 2013-02-22 23:03:52
回答 2查看 4.3K关注 0票数 0

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

我在周六(1-7-13)从源系统接收数据,并希望推送该数据,使其填满前一周的所有日期(1-6-13,1-5-13等)。

所以现在我正在做几个联合

代码语言:javascript
复制
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脚本中运行。

EN

回答 2

Stack Overflow用户

发布于 2013-02-22 23:16:24

首先,使用union all比使用union更快。union删除重复项,在这种情况下似乎不需要。如果您确实需要删除它们,则在源代码级别执行此操作:

代码语言:javascript
复制
from (select distinct name from source)

而不是使用union隐式完成。

您还可以尝试交叉连接方法:

代码语言:javascript
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-22 23:19:24

一种选择是使用递归查询,但我不认为它会更快--只是可能更容易阅读:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15027058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档