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

重複する日付範囲に関連付けられた値の合計を計算する

    この問題を解決するための私の試みは次のとおりです。

    select y,
         sum( hrs_per_week )
    from tmp_ranges t
    join(
      select daterange( x,
             lead(x) over (order by x) ) As y
      from (
        select lower( rng ) As x
        from tmp_ranges
        union 
        select upper( rng )
        from tmp_ranges
        order by x
      ) y
    ) y
    on t.rng && y.y
    group by y
    order by y
    

    デモ: http://sqlfiddle.com/#!15/ef6cb/13

    最も内側のサブクエリは、unionを使用して、すべての境界日付を1つのセットに収集します。 、次にそれらを並べ替えます。
    次に、外側のサブクエリは、leadを使用して、隣接する日付から新しい範囲を作成します。 関数。
    最後に、これらの新しい範囲は、メインクエリでソーステーブルに結合され、集計され、sum 計算されます。

    編集
    order by lead(x) overであるため、最も内側のクエリの句は冗長であり、スキップできます。 caluseはレコードを日付で並べ替え、最も内側のサブクエリの結果セットを並べ替える必要はありません。




    1. RETURNING from INSERT ...ONCONFLICTに除外された行を含める方法

    2. 別のフィールドの値が設定されている場合、MYSQLはフィールドデータを非表示にします

    3. ResultSetを閉じますが、PreparedStatementを閉じません

    4. サブクエリが相互に排他的である必要がある結果を返すレコードを除外する