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

隣接する日付範囲の行を検索し、その期間を累積します

    これはギャップと島の問題です。この場合、lag()を使用できます 島がどこから始まり、累積合計かを確認します。

    最後の操作は、いくつかの集計です(ウィンドウ関数を使用):

    SELECT p.*, 
          (Max(ends_on) OVER (PARTITION BY location_id, grp) - Min(starts_on) OVER (PARTITION BY location_id, grp) ) + 1 AS duration,
          Array_agg(p.id) OVER (PARTITION BY location_id) 
    FROM (SELECT p.*, 
                 Count(*) FILTER (WHERE prev_eo < starts_on - INTERVAL '1 day') OVER (PARTITION BY location_id ORDER BY starts_on) AS grp
          FROM (SELECT id, starts_on, ends_on, location_id, holiday_or_vacation_type_id, 
                       lag(ends_on) OVER (PARTITION BY location_id ORDER BY (starts_on)) AS prev_eo
                FROM periods 
               ) p
         ) p;
    



    1. Oracle PL/SQL-ローカルで定義された表の列名を反復処理します

    2. Symfony2およびDoctrine2:エンティティXに識別子/主キーが指定されていません。すべてのエンティティに識別子/主キーが必要です。

    3. PostgreSQLパブリックスキーマが存在するかどうかを確認するにはどうすればよいですか?

    4. PHPのMySql応答からリソースID#6をエコーするにはどうすればよいですか?