ホームページ >データベース >mysql チュートリアル >重複する日付間隔を効率的に結合するにはどうすればよいでしょうか?

重複する日付間隔を効率的に結合するにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-30 21:43:15695ブラウズ

How Can We Efficiently Merge Overlapping Date Intervals?

重複する日付間隔のマージ: 効率的なアプローチ

重複する日付間隔をマージするタスクは、さまざまなコンテキストで頻繁に発生します。この問題に対処する一般的なアプローチの 1 つは、重複がなくなるまで間隔を繰り返し更新することです。この方法は比較的単純ですが、より効率的な代替手段が存在するかどうかという疑問が生じます。

代替アプローチ:

重複する日付間隔をマージする代替アプローチが提案されています。関連するフォーラムのスレッド内のユーザーによるもの。このメソッドは、結合と条件付きロジックの組み合わせを利用して、目的の結果を実現します。

SELECT 
       s1.StartDate,
       MIN(t1.EndDate) AS EndDate
FROM @T s1 
INNER JOIN @T t1 ON s1.StartDate <= t1.EndDate
  AND NOT EXISTS(SELECT * FROM @T t2 
                 WHERE t1.EndDate >= t2.StartDate AND t1.EndDate < t2.EndDate) 
WHERE NOT EXISTS(SELECT * FROM @T s2 
                 WHERE s1.StartDate > s2.StartDate AND s1.StartDate <= s2.EndDate) 
GROUP BY s1.StartDate 
ORDER BY s1.StartDate 

説明:

このアプローチは次のように機能します:

  • 最初にテーブルをそれ自体と結合して、重複する間隔のペアを識別します。
  • 次に適用されます。他の間隔と重複する間隔をフィルターで除外する条件。
  • 次に、他のフィルターされていない間隔と重複する間隔をすべて削除します。
  • 最後に、間隔を開始日でグループ化し、計算します。それぞれの最低終了日group.

利点:

  • このアプローチにより、反復的な更新の必要性が回避され、特定のシナリオではより効率的になる可能性があります。
  • 入力順序に関係なく、一貫した結果が得られます。

例:

元の質問で提供された同じサンプル データを使用すると、次の結果が得られます:

StartDate EndDate
2010-01-01 2010-06-13
2010-06-15 2010-06-25
2010-06-26 2010-08-16
2010-11-01 2010-12-31

結論:

提示された代替アプローチは、重複する日付間隔をマージします。結合と条件付きロジックの組み合わせを活用して目的の結果を達成し、反復アプローチに代わる実行可能な代替手段を提供します。

以上が重複する日付間隔を効率的に結合するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。