資産のスケジューリングを扱うアプリケーションで、次の表を検討してください。
date group_id free_spots
2011-01-01 1 0
2011-01-01 2 0
2011-01-08 1 1
2011-01-08 2 0
2011-01-15 1 1
2011-01-15 2 1
2011-01-22 1 2
2011-01-22 2 2
2011-01-29 1 1
2011-01-29 2 0
2011-02-05 1 0
2011-02-05 2 1
2011-02-12 1 0
2011-02-12 2 1
2011-02-19 1 0
2011-02-19 2 0
この情報は、さまざまなテーブルを使用したかなり高価なクエリ (最大 100 ミリ秒) を使用してまとめられます。結果は、一時テーブルに入れるか、インラインで直接使用できます。
私が望むのは、スポットを提供する最初の日付を見つけることです (free_spots > 0)。次に、同じレコードで、スポットを提供する最後の日付が必要です。これらすべてが group_id によってグループ化されます。
説明のために、与えられたテーブルの例では、次の出力が期待されます。
group_id start_date end_date
1 2011-01-08 2011-01-29
2 2011-01-15 2011-01-22
2 2011-02-05 2011-02-12
さて、私はすでに大まかな解決策を思いつきました。指定されたテーブルを使用して、次のことを行います。
- NULL または free_spots <= 0 (開始日) のレコードのいずれかが先行*するすべてのレコードを取得します
- これらすべてのレコードについて、行が NULL であるか、または free_spots <= 0 であることが継承された最初のサクセサ * を取得します。
- どういうわけか、ここで group_id によるグループ化を混合します。
ただし、同じサブクエリを再度使用して後続レコードまたは先行レコードを見つけることはできないため、これは不可能に思えます。一時テーブルと同じ扱い。これらを複数回開いて再利用することはできません。
( * 先行または後続は日付に基づいています。各グループについて、日付は等しく、連続しており、均等に (ただし任意に) 間隔が空けられています。通常は 7 日または 14 日です)