0

私はデータの履歴変換に取り組んでおり、日付の増分を達成するためのより効率的な方法があるかどうか疑問に思っていました。

土曜日(1-7-13)にソースシステムからデータを受け取り、そのデータをプッシュして前の週のすべての日(1-6-13,1-5-13 ect)に入力したいと思います。 。

だから現在私はいくつかの組合をやっています

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スクリプトで実行されます。

4

2 に答える 2

2

まず、コードは。union allよりもを使用すると高速になりますunionunionこの場合は必要ないと思われる重複を削除します。それらを削除する必要がある場合は、ソースレベルで削除します。

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

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 に答える