次の3つの(関連するのみの)列を持つSQLDBテーブルに日付範囲データがあります。
ID
(intアイデンティティ)RangeFrom
(日付のみ)RangeTo
(日付のみ)
任意の日付範囲で、(完全にまたは部分的に)重複する可能性のある任意の数のレコードが存在する可能性があります。
条件
- より高い(新しいレコード)を持つすべてのレコードは、
ID
(完全にまたは部分的に)オーバーラップする可能性がある古いレコードよりも優先されます RangeFrom
範囲は少なくとも1日です(1日RangeTo
異なります)
したがって、特定の日付範囲(つまり、5年以内)では、次のことを行う必要があります。
- この範囲に該当するすべての範囲レコードを(完全にまたは部分的に)取得します
- これらのオーバーラップをオーバーラップしない範囲に分割します
- これらの新しい重複しない範囲を返します
私の見解
これらの範囲に関連する複雑なデータがたくさんあり(多くの結合など)、プロセッサとメモリの能力がSQL DBエンジンよりもはるかに効率的であるため、重複するデータをDBからデータレイヤーにロードして範囲を切り刻むことにしました。 /メモリ内で分割します。これにより、開発と実行の面ではるかに柔軟性とスピードが得られます。
これをDBでより適切に処理する必要があると思われる場合は、お知らせください。
質問
私は最速で、可能であればリソースを必要としない変換アルゴリズムも作成したいと思います。これらのレコードはたくさんあり、さまざまなユーザーに関連しているため、ユーザーごとにこのアルゴリズムを実行し、重複する範囲データのセットを実行する必要があります。
これらの重複する範囲を分割する最も効率的な(高速でリソースを必要としない)方法は何でしょうか?
サンプルデータ
この方法で視覚的に重複するレコードID=1
がID=5
あります(日付は実際には無関係です。この方法でこれらの重複をより適切に示すことができます)。
6666666666666
44444444444444444444444444 5555555555
2222222222222 333333333333333333333 7777777
11111111111111111111111111111111111111111111111111111111111111111111
結果は次のようになります。
111111166666666666664444444444444444444444333333333555555555511111117777777
結果は、実際には、これらのオーバーラップを上から見て、このトップダウンビューから見えるIDを取得するように見えます。
結果は実際には新しい範囲レコードに変換されるため、古いIDは無関係になります。ただし、それらの値RangeFrom
とRangeTo
値(および関連するすべてのデータ)が使用されます。
111111122222222222223333333333333333333333444444444555555555566666667777777
もちろん、これは重複する範囲の単なる例です。任意の日付範囲で、0レコードからXまでの任意の値にすることができます。ご覧のとおり、範囲ID = 2は4と6で完全に上書きされたため、完全に廃止されました。