2017-06-04 3 views
1

私は映画の予約申込みをしています。私は映画のために効率的なスケジュールを立てなければなりません。つまり、2つの映画の間の時間(スペース)は0になるはずです。SQL:2つの映画の間のスペースを見つけて、スペースを小さくする

私は何をしなければなりません:2つの映画の間に最大30分のスペースを見つけることができる機能を作り、映画は完全に重なっている例えばだから

ムービー1:11時 - 午前13時00

映画2:13時半 - 午前15時

映画3:15:30 - 16時00分機能付き

は、結果は次のようになります。

作品1:11:00 - 午後01時

作品2:午後1時00分 - 午後03時00分

ムービー3:午後03時00分 - 16時00ここに

が私のテーブルです: バージョンShowTable

+0

いくつかのサンプルデータに関連するテーブルのテーブル構造を指定できますか? – Jason

+0

私はテーブルの写真を追加しました。他の表は関係ありません。彼らはクエリに影響する情報を持っていません。 (Like:テーブルルームと映画にはRoomIDとFilmIdしかありません) – Alegou20

答えて

1
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t(Movie varchar(10),Starttime TIME,EndTime time) 
INSERT INTO #t(Movie,Starttime,EndTime) 
SELECT 'Movie 1','11:00','13:00' UNION ALL 
SELECT 'Movie 2','13:30','15:00' UNION ALL 
SELECT 'Movie 3','15:30','16:00' 
UPDATE t SET t.Starttime=p.EndTime 
FROM #t AS t 
CROSS APPLY(SELECT MAX(tt.EndTime) AS EndTime FROM #t AS tt WHERE DATEDIFF(MINUTE,tt.EndTime,t.Starttime)>0) p 
WHERE p.EndTime IS NOT NULL 

SELECT * FROM #t 
 
Movie  Starttime  EndTime 
---------- ---------------- ---------------- 
Movie 1 11:00:00.0000000 13:00:00.0000000 
Movie 2 13:00:00.0000000 15:00:00.0000000 
Movie 3 15:00:00.0000000 16:00:00.0000000 

使用している場合は、2012 + を使用している場合は、LAGを使用することもできます。

SELECT *,LAG(EndTime)OVER(ORDER BY EndTime) AS NewStartTime FROM #t 
 
Movie  Starttime  EndTime   NewStartTime 
---------- ---------------- ---------------- ---------------- 
Movie 1 11:00:00.0000000 13:00:00.0000000 NULL 
Movie 2 13:30:00.0000000 15:00:00.0000000 13:00:00.0000000 
Movie 3 15:30:00.0000000 16:00:00.0000000 15:00:00.0000000 

私は

IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t(ShowID int,RoomID int, Movie varchar(10),Starttime TIME,EndTime time) 
INSERT INTO #t(ShowID,RoomId,Movie,Starttime,EndTime) 
SELECT 1,1,'Movie 1','11:00','13:00' UNION ALL 
SELECT 3,1,'Movie 2','13:30','15:00' UNION ALL 
SELECT 4,1,'Movie 3','15:30','16:00' UNION ALL 
SELECT 2,2,'Movie 3','12:30','14:30' UNION ALL 
SELECT 5,2,'Movie 1','15:30','16:30' 
SELECT *,LAG(EndTime)OVER(partition by RoomId ORDER BY EndTime) AS NewStartTime FROM #t 
UPDATE t SET t.Starttime=isnull(p.NewStartTime,t.Starttime) 
FROM #t AS t 
inner join(
    SELECT *,LAG(EndTime)OVER(partition by RoomId ORDER BY EndTime) AS NewStartTime FROM #t 
) as p on t.ShowId=p.ShowId 

select * FROM #t AS t 

サンプルデータにroomidを追加するには、次の結果をしたあなたが望んでいたのですか?

 

    ShowID RoomID Movie Starttime EndTime 
1 1 1 Movie 1 11:00:00 13:00:00 
2 3 1 Movie 2 13:00:00 15:00:00 
3 4 1 Movie 3 15:00:00 16:00:00 
4 2 2 Movie 3 12:30:00 14:30:00 
5 5 2 Movie 1 14:30:00 16:30:00 
+0

私はバージョン2016を使用しています!その遅れの事は私のために働き、かなり明確でした!どうもありがとうございました! – Alegou20

+0

roomIdでどのように注文できますか?私は私ができることを知っている: "どこRoomId =(x)"しかし、それはxからroomIdを示しています。しかし、私はすべてを見せて、最後の時間を取ることなくroomIdで注文する必要があります。別の部屋のIDから。 – Alegou20

+0

あなたは 'ORDER BY RoomId'を試しましたか? –

関連する問題