2

履歴レポートにフィードする一連のテーブルがあります。現在、レポートの生成には時間がかかります。コンパイルされたデータを格納してレポートにフィードするキャッシュテーブルを作成したいと思います。

これらのキャッシュテーブルの1つのキーは、日付フィールドになります。使用する一連の日付にギャップがないことを確認したいと思います。たとえば、1月1日と3日のレコードは必要ありませんが、2番目の日付には行がありません。

RDBMSのリレーショナルツールでこれを強制する方法を考えることはできません。関連するレコードが一連の日付の範囲外にならないように日付のテーブルを設定できます。つまり、「日付シリーズ」テーブルに一致する行がない場合は1月2日を禁止しますが、範囲内の日付をスキップしないように自動的に確認する方法がわかりません。

データベーススキーマ定義でこれを自動的に行う方法はありますか?または、コードのギャップをチェックする必要がありますか?

MySQLを使用していますが、これはRDBMSに依存しないようです。

4

3 に答える 3

2

私はそれを行うための組み込みの方法を知りませんが、私がこれを自分で処理した方法は、日付のテーブルを生成することです。と呼ばれる静的テーブルがtbDatesあり、ある範囲の日付についてレポートする必要があり、データが欠落している可能性のある日付をスキップしたくない場合は、次のようにします。

select *
from 
    tbDates d
    left join myTable t
        on d.date = t.date

表にある日付列の形式とデータタイプによっては、tbDatesと結合できるように、データを少しフォーマットする必要がある場合があります。一部のアプリにはtbDatesがありません。そのような場合、必要な範囲の連続した日付を持つ一時テーブルを生成するのは簡単です。

于 2012-02-10T18:32:10.197 に答える
1

これは、数値テーブル(http://www.projectdmx.com/tsql/tblnumbers.aspx)の有用性の優れた例です。

1万行の数字テーブルを作成します。次に、そのテーブルから選択して、DATEADD関数を使用できます。

SELECT DATEADD(d, a.id, '2012-01-01')
FROM NumbersTable

このクエリを使用すると、データへの適切な左結合と同じくらい簡単になり、欠落している日付を確認できます。

または、数値テーブルを使用するのではなく、日付テーブルを作成することもできます。実際、日付テーブルには(休日以外の)平日しか入力できません。簡単!

于 2012-02-10T18:29:56.450 に答える
0

これを自動的に行う方法はありませんが、日付を生成して一時テーブルに保存することはできます。

これは、ストアドプロシージャで実行できます。

  • 一時テーブルを作成する
  • 開始日から終了日までの値を挿入します(毎日)
  • 結果を選択し、一時テーブルに参加します
  • 一時テーブルで対応していない行のみを選択します
于 2012-02-10T18:29:36.790 に答える