グッドデザイン賞を受賞したウォーターサーバー >>

EVENT
--+-------------------------+----------------+
id| EVT| start_date | end_date
--+-------------------------+-----------------+
0 |AAAA| 2013-06-01 10:00 | 2013-06-01 14:00|
--+-------------------------+-----------------+
1 |BBBB| 2013-06-01 12:00 | 2013-04-01 18:00|
--+-------------------------+-----------------+
2 |CCCC| 2013-06-02 10:00 | 2013-06-05 12:00|
--+-------------------------+-----------------+
3 |DDDD| 2013-06-02 13:00 | 2013-06-05 18:00|
--+-------------------------+-----------------+
4 |EEEE| 2013-06-02 14:30 | 2013-06-05 17:00|



↑こんな感じでイベントを管理するテーブルがあります。
イベントの開催時間の重複を加味して何らかのイベントのある
連続した時間帯のみ取り出すSQLを書きたいのですが、
いい案はありますでしょうか?

結果的には以下の様な情報が取り出したいです。

2013-06-01 10:00 - 18:00
2013-06-02 10:00 - 12:00
2013-06-02 13:00 - 18:00

ID 0と1は連続してるので 10:00 - 18:00
ID 2はどれとも連続してないので 10:00 - 12:00
ID 4はID3の中にあるので無視

このQ&Aに関連する最新のQ&A

A 回答 (1件)

記載のデータって正しいですか?


このデータだとID:2~4が連続することになると思うのですが。

正しいデータが不明なので、期待どおりの結果が取れるか分かりませんが、

select min(START_DATE) START_DATE, max(END_DATE) END_DATE
from(
select ID, START_DATE, END_DATE, sum(TERM_START) over(order by START_DATE, END_DATE) TERM_ID
from (
select ID, START_DATE, END_DATE, case when START_DATE >= LAG(END_DATE, 1) OVER(ORDER BY START_DATE, END_DATE) THEN 1 else 0 end TERM_START
from EVENT
)
)
group by TERM_ID
order by START_DATE, END_DATE;

こんな感じでどうでしょうか。
    • good
    • 0
この回答へのお礼

大変申し訳ありませんでした。  m(_ _)m

確かにデータが間違いでした。
申し訳ございません。


EVENT
--+-------------------------+----------------+
id| EVT| start_date      | end_date
--+-------------------------+-----------------+
0 |AAAA| 2013-06-01 10:00 | 2013-06-01 14:00|
--+-------------------------+-----------------+
1 |BBBB| 2013-06-01 12:00 | 2013-04-01 18:00|
--+-------------------------+-----------------+
2 |CCCC| 2013-06-02 10:00 | 2013-06-02 12:00|
--+-------------------------+-----------------+
3 |DDDD| 2013-06-02 13:00 | 2013-06-02 18:00|
--+-------------------------+-----------------+
4 |EEEE| 2013-06-02 14:30 | 2013-06-02 17:00|
--+-------------------------+-----------------+

yamada_g 様 ありがとうございました。

流した結果、正確に出力できました。
勉強が足りないと,痛感している次第です。

お礼日時:2013/09/26 18:14

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q時間範囲が重複したレコードを返すSQL

PostgreSQL(データベース)の
カラムに指定した時間範囲が存在する場合、エラーとし
存在しない場合、INSERTしたいのですが、
どのようなSQLを書けば良いでしょうか?

◆カラム内容
開始時間 終了時間
12:00   14:00
14:00   19:00
という2つのレコードが格納されていた場合に、
以下のSELECT→INSERTという流れで考えています。

19:00から19:05はOKで、INSERT処理を行う
18:55から19:05はNGで、重複したレコードを返す
10:00から12:00はOKで、INSERT処理を行う
10:00から12:05はNGで、重複したレコードを返す

Aベストアンサー

PL/SQLなら判るんですが。

reserveテーブルに対して、

SELECT COUNT(*) AS C FROM reserve WHERE reserve_date = 'reserve_date' AND ( start_time BETWEEN S_time AND E_time OR end_time BETWEEN s_time AND E_time)

とすれば、時間が重なっているレコード数が取れます。Cの値が「0」であればINSERT可能です。

一つのSQL文では、ムリなので、重複レコードがあるかをチェックし、無ければINSERT処理を、あればSELECT文を発行してください。

Q期間の重複を調べるSQL文について・・・

EVENT
--+------------+------------+
id | start_date | end_date
--+------------+------------+
0 | 2007-06-01 | 2007-06-03 |
--+------------+------------+
1 | 2007-06-04 | 2007-04-06 |
--+------------+------------+
2 | 2007-06-02 | 2007-06-05 |

↑こんな感じでイベントを管理するテーブルがあります。
イベントの開催期間の重複を出力するSQL文を書きたいのですが、
何かいい案はありませんでしょうか???

結果的には重複し合っているレコードのidを出力させたいです。
よろしくお願いします。

Aベストアンサー

#3で提示したような結果でいいなら、下記SQLで実現できると思います。

select x.id,y.id as 重複id
from t1 as x,t1 as y
where
(x.sdate between y.sdate and y.edate
or x.edate between y.sdate and y.edate)
and x.id<>y.id
order by x.id,y.id;


人気Q&Aランキング