PostgreSQL 8.3.8 を使用しています。
time_boundaries テーブルに、時間境界 (日付別) のリストがあります。
CREATE TABLE role_times_boundaries
(
role_date DATE,
time_boundary TIME
);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-24'::date, '09:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-24'::date, '10:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '07:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '08:50:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '09:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '12:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '13:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '16:00:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '17:30:00'::time);
INSERT INTO role_times_boundaries (role_date, time_boundary) VALUES ('2013-04-25'::date, '20:00:00'::time);
そして、私はこのテーブルコンテンツを持っています:
role_date | time_boundary
------------+---------------
2013-04-24 | 09:00:00
2013-04-24 | 10:00:00
2013-04-25 | 07:00:00
2013-04-25 | 08:50:00
2013-04-25 | 09:00:00
2013-04-25 | 12:00:00
2013-04-25 | 13:00:00
2013-04-25 | 16:00:00
2013-04-25 | 17:30:00
2013-04-25 | 20:00:00
目標
各 time_boundary を「start_time」として、次の time_boundary (順序による) を同じ日付として、「role_times_boundaries」で自己内部結合を行うことにより、「タイム スライス リスト」テーブルを作成したいと思います。目標は、その結果を得ることです:
role_date | start_time | end_time
------------+------------+----------
2013-04-24 | 09:00:00 | 10:00:00
2013-04-25 | 07:00:00 | 08:50:00
2013-04-25 | 08:50:00 | 09:00:00
2013-04-25 | 09:00:00 | 12:00:00
2013-04-25 | 12:00:00 | 13:00:00
2013-04-25 | 13:00:00 | 16:00:00
2013-04-25 | 16:00:00 | 17:30:00
2013-04-25 | 17:30:00 | 20:00:00
仮の
このSQLクエリを介して希望の結果を取得しようとしました
SELECT role_times_boundaries.role_date,
role_times_boundaries.time_boundary AS start_time,
end_time_boundaries.time_boundary AS end_time
FROM role_times_boundaries
INNER JOIN (
SELECT role_date,
time_boundary
FROM role_times_boundaries
) AS end_time_boundaries ON (
role_times_boundaries.role_date = end_time_boundaries.role_date
AND end_time_boundaries.time_boundary = (
SELECT MIN(a_list_of_end_boundaries.time_boundary)
FROM role_times_boundaries AS a_list_of_end_boundaries
WHERE a_list_of_end_boundaries.time_boundary > role_times_boundaries.time_boundary
)
)
結果は次のとおりです。
role_date | start_time | end_time
------------+------------+----------
2013-04-24 | 09:00:00 | 10:00:00
2013-04-25 | 07:00:00 | 08:50:00
2013-04-25 | 08:50:00 | 09:00:00
2013-04-25 | 12:00:00 | 13:00:00
2013-04-25 | 13:00:00 | 16:00:00
2013-04-25 | 16:00:00 | 17:30:00
2013-04-25 | 17:30:00 | 20:00:00
よく見ると、09:00:00 から 12:00:00までのタイム スライスが欠落しています。しかし、私はまだ理由を理解しておらず、まだエラーを見つけていません。