私は自分の会社で、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のようないくつかのハードコーディングされたデフォルトに移入する必要があります
- 最初に、そしては@uの中で最も最近の非null要素を保存し、ファイナルテーブルのすべての要素の上に累積和
- ループを計算する日付のギャップを埋める:これまでは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つではなく2つの冗長テーブルを作成するのはなぜですか? –