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

SQL で重複する日付間隔を効率的にマージするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-04 16:22:41584ブラウズ

How to Efficiently Merge Overlapping Date Intervals in SQL?

重複する日付間隔のマージ

データ分析の領域では、重複する時間範囲または日付間隔が発生することがよくあります。これらの重複する間隔を個別のレコードに効果的にマージするには、堅牢で効率的なソリューションが必要です。

ループ内で一連の UPDATE ステートメントを使用して、重複する日付間隔をマージする 1 つの簡単なアプローチが指定された質問で示されています。この方法では望ましい結果が得られますが、より洗練された、またはパフォーマンスの高いソリューションがあるのではないかという懸念が生じます。

代替アプローチ

提供された回答で実装された代替アプローチは、相関サブクエリと NOT EXISTS 条件の威力。このアプローチには、重複する間隔を特定してマージするために連携して動作する複数の SQL ステートメントが含まれます。

SELECT 
       s1.StartDate,
       --t1.EndDate 
       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 

手順の詳細:

  1. 重複する間隔の特定:クエリは、各間隔 (s1) と、それに重なる他の間隔 (t1) を組み合わせます。これは、INNER JOIN 条件 s1.StartDate <= t1.EndDate.
  2. Exception Indirect Overlaps: サブクエリ NOT EXISTS(SELECT * FROM @T t2 WHERE t1.EndDate >) によって実現されます。 ;= t2.StartDate AND t1.EndDate < t2.EndDate) は、直接の重複のみが考慮されるようにします。これにより、重複する間隔のチェーンによって間接的に接続されている間隔のマージが防止されます。
  3. 重複間隔の削除: 外側の NOT EXISTS 条件 NOT EXISTS(SELECT * FROM @T s2 WHERE s1.開始日 > s2.開始日 AND s1.開始日 < s2.EndDate) により、開始日は同じで終了日が異なる個別の間隔をマージできなくなります。これにより、一意の間隔のみが結果に表示されるようになります。
  4. 重複しない間隔の選択: サブクエリを相関させ、NOT EXISTS 条件を利用することにより、クエリは重複を除外しながら重複する間隔を効果的に識別してマージします。

このアプローチでは、以前の方法に比べてパフォーマンスと明瞭さが向上します。反復的な UPDATE メソッドであり、SQL 環境で重複する日付間隔をマージするための推奨ソリューションとなります。

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

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