sql >> データベース >  >> RDS >> PostgreSQL

重複する時間間隔をマージするには、どうすればよいですか?

    このクエリを試すこともできます(PM 77-1で提供されたソリューション以外にソリューションが追加されたら 上記のコメントで):

    WITH RECURSIVE cte( id, date_start, date_end ) AS
    (
      SELECT id, date_start, date_end
      FROM evento
      UNION 
      SELECT e.id,
             least( c.date_start, e.date_start ),
             greatest( c.date_end, e.date_end )
      FROM cte c
      JOIN evento e
      ON e.date_start between c.date_start and c.date_end
         OR 
         e.date_end between c.date_start and c.date_end
    )
    SELECT distinct date_start, date_end
    FROM (
      SELECT id, 
             min( date_start) date_start, 
             max( date_end ) date_end
      FROM cte
      GROUP BY id
    ) xx
    ORDER BY date_start;
    

    デモ---> http://www.sqlfiddle.com/#!12/ bdf7e / 9

    ただし、巨大なテーブルの場合、このクエリのパフォーマンスはひどく遅くなる可能性があり、一部の手続き型アプローチの方がパフォーマンスが向上する可能性があります。




    1. 結果を取得しようとすると、PHPクラスを使用したDBへの接続が機能しません

    2. PostgreSQL8.3以降のOLTPパフォーマンス

    3. PHPでmysqlクエリを行ごとに繰り返す方法

    4. SQL Data Reader データを DataTable にロードする際の問題