回答編集履歴
6
修正
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
修正
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
修正
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 日付,開始時刻
|
24
|
+
order by 場所CD,日付,開始時刻
|
25
25
|
```
|
26
26
|
手っ取り早くunionにしていますが、時間がかかるようなら除外条件(予定が無い場合)をいれて、union allとすれば、unionマージの時間は省けます。
|
3
修正
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(
|
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
修正
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
修正
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
|