【问题标题】:recursively increment a date in sql递归增加sql中的日期
【发布时间】:2013-02-08 05:46:44
【问题描述】:

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

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

【问题讨论】:

    标签: sql loops data-warehouse teradata


    【解决方案1】:

    首先,使用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
    

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

    【讨论】:

    • 我非常喜欢这里的“for..next 循环使用交叉连接”技术。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2017-11-03
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2010-12-01
      相关资源
      最近更新 更多