質問するログイン新規登録

回答編集履歴

6

修正

2017/08/30 04:05

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,11 +1,9 @@
1
- こんにちは。
2
-
3
1
  こんな感じでどうでしょうか。
4
2
  概略としては、
5
3
  ・テーブルAからその日の予定の開始~終了以外の両端の空き時間を求める。
6
4
  ・テーブルBから、lag()によって前回の終了時刻を求め、それを空の開始時刻、開始時刻を終了時刻とする。
7
5
  (最初の空き時間はテーブルAから求めているので、NUll判定で除去)
8
- ・上記をUNIONでマージ(予定が無い場合はUNIONでマージされて結果テーブルAと同じになる)
6
+ ・上記をUNIONでマージ(予定が無い場合はUNIONでマージされて結果テーブルAと同じになる)
9
7
 
10
8
  ```SQL
11
9
  select 日付, 場所CD

5

修正

2017/08/30 04:05

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -12,6 +12,7 @@
12
12
  , 開始時刻
13
13
  , coalesce((select min(開始時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付), 終了時刻) as 終了時刻
14
14
  from tbla as ta
15
+ where 開始時刻<((select min(開始時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付))
15
16
  union
16
17
  select 日付, 場所CD, 前回終了時刻, 開始時刻
17
18
  from (select *, lag(終了時刻,1) over(partition by 場所CD, 日付 order by, 開始時刻) as 前回終了時刻 from tblb) tmp
@@ -21,6 +22,7 @@
21
22
  , coalesce((select max(終了時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付), 開始時刻)
22
23
  , 終了時刻
23
24
  from tbla as ta
25
+ where 終了時刻>((select max(終了時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付))
24
26
  order by 場所CD,日付,開始時刻
25
27
  ```
26
28
  手っ取り早くunionにしていますが、時間がかかるようなら除外条件(予定が無い場合)をいれて、union allとすれば、unionマージの時間は省けます。

4

修正

2017/08/30 02:37

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -21,6 +21,6 @@
21
21
  , coalesce((select max(終了時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付), 開始時刻)
22
22
  , 終了時刻
23
23
  from tbla as ta
24
- order by 日付,開始時刻,場所CD
24
+ order by 場所CD,日付,開始時刻
25
25
  ```
26
26
  手っ取り早くunionにしていますが、時間がかかるようなら除外条件(予定が無い場合)をいれて、union allとすれば、unionマージの時間は省けます。

3

修正

2017/08/30 01:54

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -14,7 +14,7 @@
14
14
  from tbla as ta
15
15
  union
16
16
  select 日付, 場所CD, 前回終了時刻, 開始時刻
17
- from (select *, lag(終了時刻,1) over(order by 日付, 開始時刻) as 前回終了時刻 from tblb) tmp
17
+ from (select *, lag(終了時刻,1) over(partition by 場所CD, 日付 order by, 開始時刻) as 前回終了時刻 from tblb) tmp
18
18
  where 前回終了時刻 is not null
19
19
  union
20
20
  select 日付, 場所CD

2

修正

2017/08/30 01:49

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -22,4 +22,5 @@
22
22
  , 終了時刻
23
23
  from tbla as ta
24
24
  order by 日付,開始時刻,場所CD
25
- ```
25
+ ```
26
+ 手っ取り早くunionにしていますが、時間がかかるようなら除外条件(予定が無い場合)をいれて、union allとすれば、unionマージの時間は省けます。

1

修正

2017/08/30 01:40

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  ```SQL
11
11
  select 日付, 場所CD
12
12
  , 開始時刻
13
- , coalesce((select min(開始時刻) from tblb where 日付=ta.日付), 終了時刻) as 終了時刻
13
+ , coalesce((select min(開始時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付), 終了時刻) as 終了時刻
14
14
  from tbla as ta
15
15
  union
16
16
  select 日付, 場所CD, 前回終了時刻, 開始時刻
@@ -18,7 +18,7 @@
18
18
  where 前回終了時刻 is not null
19
19
  union
20
20
  select 日付, 場所CD
21
- , coalesce((select max(終了時刻) from tblb where 日付=ta.日付), 開始時刻)
21
+ , coalesce((select max(終了時刻) from tblb where 場所CD=ta.場所CD and 日付=ta.日付), 開始時刻)
22
22
  , 終了時刻
23
23
  from tbla as ta
24
24
  order by 日付,開始時刻,場所CD