補助テーブルの作成を避けるために、再帰的な CTE を使用することもできます。
WITH "CTE"
AS
(
SELECT "id", "starttime" FROM "data"
UNION ALL
SELECT "id", DATEADD( MINUTE, 15, "starttime" )
FROM "CTE"
WHERE "starttime" < ( SELECT "endtime" FROM "data" AS D2 WHERE D2."id" = CTE."id" )
)
SELECT * FROM "CTE"
ORDER BY "ID"
SQL-Fiddle-Demoを参照してください。
上記のクエリでは、データ テーブルの開始時間と終了時間の組み合わせの違いが 15 で割り切れると想定しています。
正確に 15 で割り切れない日時で動作するようにクエリを編集しました。選択した 15 分の間隔が最後に計算された間隔に収まらない場合、拒否されます。
WITH "CTE"
AS
(
SELECT "id", "starttime" FROM "data"
UNION ALL
SELECT "id", DATEADD( MINUTE, 15, "starttime" )
FROM "CTE"
WHERE "starttime" <= ( SELECT DATEADD( MINUTE, -15, "endtime" ) FROM "data" AS D2 WHERE D2."id" = CTE."id" )
)
SELECT * FROM "CTE"
ORDER BY "ID"
結果で ( fiddle-demo で) 拒否された最後のタイムスタンプを取得したい場合は、 にid 2, timestamp "12:00:00"
変更<=
するだけ<
です。これは、ハーフ オープン インターバルで作業している場合にも関係します。
編集された SQL-Fiddle-Demoを参照してください