2012-01-12 11 views
0

私は自分の会社で、SCMから、変更された行数などのソースコードアクティビティについて時間をかけて情報を引き出すスクリプトを開発しています。私はその後、インナーを使用して、累積結果が参加し、合計でテーブルを複製最新の値で埋める日付のギャップ

+------------+-------+------+ 
| date  | prod | line | 
+------------+-------+------+ 
| 2011-11-25 | prod2 | 471 | 
| 2011-11-28 | prod2 | 389 | 
+------------+-------+------+ 

:同じ日以内に発生し、特定の製品のためのすべての変更は、MySQLのテーブルで単一のレコード、このようなものに結合されています:

+------------+-------+------+ 
| date  | prod | line | 
+------------+-------+------+ 
| 2011-11-25 | prod2 | 471 | 
| 2011-11-28 | prod2 | 860 | 
+------------+-------+------+ 

ここで、製品ごとに1日あたり1つのレコードを持つテーブルを作成したいとします。私はカレンダーテーブルに参加することでそれを実行できました。私はこの問題を解決してきました

+------------+-------+------+ 
| date  | prod | line | 
+------------+-------+------+ 
| 2011-11-25 | prod2 | 471 | 
| 2011-11-26 | prod2 | 471 | 
| 2011-11-27 | prod2 | 471 | 
| 2011-11-28 | prod2 | 860 | 
+------------+-------+------+ 

:新しいレコードが作成されている場合しかし、ラインフィールドには、その製品用の最新の累積的な値ではなく、NULLまたは0のようないくつかのハードコーディングされたデフォルトに移入する必要があります

  1. 最初に、そしては@uの中で最も最近の非null要素を保存し、ファイナルテーブルのすべての要素の上に累積和
  2. ループを計算する日付のギャップを埋める:これまでは2つのあっけなく方法ser変数。

私のテーブルが十分に大きくなったら、最初の解決策は非常に非効率になりました。 2番目の解決策は仕事を完了させますが、私はより洗練された解決策を見つけようとしています。ここでは、NULL値を持つテーブルを作成するコードは次のとおりです。

INSERT INTO final SELECT d.date,f.prod,p.line 
FROM calendar AS d 
CROSS JOIN 
    (SELECT DISTINCT prod FROM cumulative) AS f 
LEFT JOIN cumulative AS p USING (date,prod) ; 

任意のアイデア?私はMySQLを使用しています。

+1

1つではなく2つの冗長テーブルを作成するのはなぜですか? –

答えて

0

行が変更されていない場合は1日に1行を保存するのが最も賢明なようです。これは、カレンダーテーブルへの参加の必要性を排除します。

だからではなく、あなたのソーステーブルが、それは次のようになります。この

+------------+-------+------+ 
| date  | prod | line | 
+------------+-------+------+ 
| 2011-11-25 | prod2 | 471 | 
| 2011-11-28 | prod2 | 389 | 
+------------+-------+------+ 

のように見えます。

+------------+-------+------+ 
| date  | prod | line | 
+------------+-------+------+ 
| 2011-11-25 | prod2 | 471 | 
| 2011-11-26 | prod2 | 0 | 
| 2011-11-27 | prod2 | 0 | 
| 2011-11-28 | prod2 | 389 | 
+------------+-------+------+ 

実行集計自体については、レポート作成者がこれをSQLよりも速く行うことができます。 MySQLがウィンドウ処理機能をサポートしている場合は、

select date, prod, 
     sum(line) over (partition by prod order by date) 
from prod 

などと書くだけですが、レポート作成者の方が速いかもしれません。

ウィンドウ機能をサポートしていないプラットフォームでは、サブクエリに合計が必要です。

select p1.prod, p1.date, 
     (select sum(line) from prod 
     where prod = p1.prod and date <= p1.date) as num_lines 
from prod p1 
order by p1.prod, p1.date 
関連する問題